Ответ 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-устройств, использование техники, которая в некоторых случаях позволяет вам разбить части вашего приложения на отдельные процессы, каждый со своей собственной кучей, кажется замечательным подарком, В этом могут быть скрытые опасности, которые я еще не рассмотрел или не испытал, но пока что так хорошо, в моем конкретном случае.