Использование Android: процесс - PullRequest
37 голосов
/ 22 августа 2011

У меня есть этот файл 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: process» добавлен как тег манифеста и тег провайдера, я знаю, если он добавлен как тег провайдера, провайдер может бытьзапустить в процессе "com.lily.process".Но какая польза от него, когда он написан как метка манифеста?Я пытался, но не все компоненты могли работать в процессе, который он определил.

Ответы [ 4 ]

110 голосов
/ 29 мая 2012

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

5 голосов
/ 24 декабря 2013

@ Carl

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

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

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

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

1 голос
/ 12 октября 2011

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

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

0 голосов
/ 16 июля 2019

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

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

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

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

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

...