Я бы согласился, что не многие люди считают, что android: process может быть полезен в качестве атрибута тега приложения.Однако я обнаружил, что он полезен в качестве атрибута тега активность .
Цель действия android:process
в операции - указать, что ваша деятельность должна запускаться в процессе.имея конкретное имя.Выбор этого имени может использоваться либо для изоляции действия в его собственном процессе (отличающемся от запускающего его), либо для принудительного сожительства в одном процессе с другими действиями, которые используют то же имя.
В соответствии с Руководством разработчика (http://developer.android.com/guide/topics/manifest/activity-element.html):
"Если имя, присвоенное этому атрибуту, начинается с двоеточия (':'), то при необходимости создается новый процесс, частный для приложения, идействие запускается в этом процессе. Если имя процесса начинается со строчной буквы, действие будет выполняться в глобальном процессе с таким именем, если у него есть разрешение на это. Это позволяет компонентам в разных приложениях совместно использовать процесс, сокращая ресурсиспользование. "
Недавно я обнаружил, что этот атрибут полезен при решении проблемы, возникшей у меня с запуском вспомогательного действия для приложения, которое при определенных обстоятельствах было достаточно близко к пределу кучи в 16 МБ, который все еще применяется кв некоторых ситуациях запускмое приложение превысило лимит, что привело к принудительному закрытию.
Используя тег android:process
, я смог указать, что моя справочная деятельность должна запускаться в отдельном отдельном процессе.У этого процесса была своя собственная куча 16 МБ, и она не учитывалась в куче моего основного приложения, которое его запустило.Это навсегда и полностью препятствовало тому, чтобы моему приложению не хватало места в куче и происходило сбой при запуске справки.
Если ваше запускающее приложение имеет имя пакета
com.mycompany.mymainapp
и поэтому ему присвоено имя процессато есть та же самая строка, тогда, если вы используете
android:process=":myhelp"
в запущенной операции, ей будет присвоено имя процесса
com.mycompany.mymainapp:myhelp
, и этот процесс будет иметь свой отдельный, отдельныйID процесса, который вы можете просмотреть (например, в 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, используя технику, котораяможет, в некоторых случаях, позволить вам разбивать части вашего приложения на отдельные процессы, каждый со своей кучей, кажется замечательным подарком.При этом могут быть скрытые опасности, которые я еще не рассматривал и не испытывал, но пока что так хорошо в моем конкретном случае.