Подтвердить что ты не робот

Использование андроида: процесс

У меня есть этот файл AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="1" android:versionName="1.0.0.0721"
android:process="com.lily.process" package="com.lily.test">

    <provider android:authorities="com.lily.test"
      android:name="com.lily.test.provider" 
      android:process="com.lily.process">
    </provider>

"android: процесс" добавляется как в тег манифеста, так и в тег поставщика, я знаю, добавлен ли он в качестве тега поставщика, поставщик может быть запущен в процессе "com.lily.process". Но каково его использование при написании как манифеста? Я попытался, но не все компоненты могли работать в процессе, который он идентифицировал.

4b9b3361

Ответ 1

Я бы согласился с тем, что не многие люди найдут android: процесс будет полезен как атрибут тега приложения. Однако я нашел, что это полезно как атрибут тега активности.

Цель android:process в действии - указать, что ваша активность должна запускаться в процессе, имеющем определенное имя. Выбор этого имени может быть использован либо для изоляции активности в ее собственном процессе (отличной от той, которая была запущена), либо для принудительного совместного использования в одном процессе с другими действиями, которые используют одно и то же имя.

В руководстве Dev (http://developer.android.com/guide/topics/manifest/activity-element.html):

"Если имя, присвоенное этому атрибуту, начинается с двоеточия (':'), новый процесс, закрытый для приложения, создается, когда это необходимо, и действие выполняется в этом процессе. Если имя процесса начинается с строчный символ, действие будет выполняться в глобальном процессе этого имени при условии, что у него есть разрешение на это. Это позволяет компонентам в разных приложениях совместно использовать процесс, уменьшая использование ресурсов".

Недавно я обнаружил, что этот атрибут полезен при решении проблемы, с которой я столкнулся при запуске вспомогательной активности для приложения, которое при определенных обстоятельствах было достаточно близко к пределу кучи 16 МБ, который по-прежнему применяется к некоторым устройствам. Запуск своей деятельности по оказанию помощи заключался в том, что в таких ситуациях я нажимал свое приложение на предел, в результате чего сила закрывалась.

Используя тэг android:process, я смог указать, что моя помощь должна быть запущена в отдельном отдельном процессе. Этот процесс имел свою собственную 16-мегабайтную кучу, и она не учитывалась от кучи моего основного приложения, которое запустило его. Это постоянно и полностью помешало моему приложению бежать из места кучи и сбой, когда была запущена помощь.

Если ваше приложение для запуска имеет имя пакета

com.mycompany.mymainapp

и поэтому присваивается имя процесса, которое является той же строкой, а затем, если вы используете

android:process=":myhelp"

в вашей запущенной деятельности ему будет присвоено имя процесса

com.mycompany.mymainapp:myhelp

и этот процесс будет иметь свой собственный отдельный идентификатор процесса, который вы можете просмотреть (например, в DDMS).

Это, по крайней мере, был моим опытом. Мое тестирование до сих пор было выполнено на старом Moto Droid, работающем на CM6 (Android 2.2.1), настроенном на ограничение кучи 16 МБ.

В моем случае, поскольку я не хотел, чтобы пользователь воспринимал эту помощь как отдельную от моего приложения, я включил

android:excludeFromRecents="true"

чтобы предотвратить появление активности справки в списке последних приложений (длинный прессу). Я также включил

android:taskAffinity="com.mycompany.mymainapp.HelpActivity"

где HelpActivity - это имя операции справки, чтобы отделить активность в своей собственной задаче

Я также добавил:

android:launchMode="singleInstance"

чтобы предотвратить создание нескольких экземпляров этого приложения каждый раз, когда пользователь вызывается справкой.

Я также добавил флаг:

Intent.FLAG_ACTIVITY_NEW_TASK

для намерения, используемого для запуска действия справки.

Эти параметры могут потребоваться или не понадобиться, в зависимости от использования, которое вы используете в атрибуте android:process.

Учитывая, как часто возникают проблемы с памятью при разработке для Android-устройств, использование техники, которая в некоторых случаях позволяет вам разбить части вашего приложения на отдельные процессы, каждый со своей собственной кучей, кажется замечательным подарком, В этом могут быть скрытые опасности, которые я еще не рассмотрел или не испытал, но пока что так хорошо, в моем конкретном случае.

Ответ 2

@Carl

Там могут быть скрытые опасности:

  • Память не может быть выпущена. Когда в том же процессе есть фоновое обслуживание (например, android: process = ": myhelp" ).
  • Нельзя использовать шаблон Singleton.

Ссылка: http://developer.android.com/training/articles/memory.html#MultipleProcesses

Теперь процесс почти утроился по размеру, до 4 МБ, просто показывая некоторый текст в пользовательском интерфейсе. Это приводит к важному выводу: если вы собирается разделить ваше приложение на несколько процессов, только один процесс должен отвечать за пользовательский интерфейс. Другие процессы должны избегать любого пользовательского интерфейса, поскольку это быстро увеличит объем оперативной памяти, необходимый для процесса (особенно как только вы начнете загружать битмап-активы и другие ресурсы). Тогда он может быть трудным или невозможным уменьшить использование памяти после создания пользовательского интерфейса.

Ответ 3

android: process и shareduserid могут использоваться для передачи ресурсов между пакетами. В моем случае это сейчас пригодится :)

Пример исходного кода: https://github.com/ikust/hello-sharedprocess

Ответ 4

Android: процесс следует использовать с осторожностью

(Цитата по ссылке ниже)

Малоизвестное и, казалось бы, недокументированное поведение Android состоит в том, что каждый процесс приложения имеет собственный экземпляр Application.

Итак, если у вас есть служба, которая работает в другом процессе, вызов startService() инициирует класс Appplication для вашего приложения.

Подробнее - Запуск сервиса в звонках Android Приложения по созданию