Android может решить завершить процесс в случае нехватки памяти или если память востребована другими, более важными процессами. Прикладные компоненты, выполняющиеся в этих процессах, будут уничтожены. Процесс будет перезапущен для компонентов в случае их повторного вызова.
При выборе процесса для уничтожения Android оценивает относительную важность этого процесса с точки зрения пользователя, т. е. "видимый пользователю компонент данного процесса, например деятельность на переднем плане, считается более важным компонентом, чем служба, выполняющаяся в другом процессе. Также система в первую очередь завершит процесс с деятельностями, которые больше не видны на экране, а не процесс с видимыми деятельностями. Поэтому решение о завершении процесса зависит от состояния компонентов, выполняющихся в данном процессе.
Приоритет и статус процессов
Порядок, в котором процессы уничтожаются для освобождения ресурсов, определяется приоритетом. Система Android пытается поддерживать процесс приложения максимально долго, но, в конечном счете, будет вынуждена удалить старые процессы, если заканчивается свободная память. Чтобы определить, какой процесс сохранить или уничтожить, Android создает иерархию важности процессов, основанную на компонентах, выполняющихся в процессах и состоянии этих компонентов (рис. 4.1).
}
Критический приоритет
Высокий приоритет
Низкий приоритет
Рис. 4.1. Приоритет и статус процессов
Процессы с самой низкой важностью уничтожаются первыми. Есть пять уровней в иерархии важности. Следующий список представляет их в порядке убывания важности.
□ Активный процесс (Foreground Process) — тот, который требуется для того, что пользователь в настоящее время делает. Процесс считается активным, если выполняется любое из следующих условий:
• процесс выполняет деятельность, с которой взаимодействует пользователь;
• процесс выполняет службу, которая связана с деятельностью, с которой взаимодействует пользователь;
• процесс имеет объект service, и выполняется один из методов обратного вызова, определенных в этом объекте;
• процесс имеет объект BroadcastReceiver, и выполняется его метод обратного вызова для приема намерения.
Одновременно могут существовать только несколько приоритетных процессов. Они будут уничтожены только в крайнем случае — если памяти настолько мало, что они все вместе не в состоянии продолжать работу.
□ Видимый процесс (Visible Process) — тот, который не имеет никаких приоритетных компонентов. Компонент из этого процесса еще может вызываться пользователем. Процесс, как полагают, является видимым, если выполняется любое из следующих условий:
• это процесс деятельности, которая не находится в фокусе, но все еще видна пользователю. Это может произойти, например, при вызове диалога, который не занимает весь экран, а деятельность потеряла фокус, но видна пользователю и находится позади диалога;
• это служба, которая в данный момент связана с деятельностью, находящейся на переднем плане (или частично закрытой другой деятельностью).
□ Видимый процесс считаются важным и не будет уничтожен, пока остаются процессы с более низким приоритетом.
□ Сервисный процесс (Service Process)— процесс, в котором выполняется служба и который не относится ни к одной из двух предыдущих категорий. Хотя сервисные процессы обычно не привязаны к интерфейсу, видимому пользователем, они выполняют задания, нужные пользователю, например фоновая работа медиаплеера или загрузка данных из сети, так что система сохраняет их при наличии свободной памяти наряду со всеми активными и видимыми процессами.
□ Фоновый процесс (Background Process)— процесс в котором выполняется деятельность, которую в настоящее время не видима пользователем. Эти процессы не имеют никакого прямого воздействия на пользовательский ввод и могут быть уничтожены в любое время, чтобы востребовать память для активного, видимого или сервисного процесса. Обычно имеется много фоновых процессов, они сохраняются в списке LRU (least recently used, "не использующиеся дольше всех"), чтобы гарантировать, что находящийся в конце этого списка процесс, в котором выполняется деятельность, был бы уничтожен в последнюю очередь.
□ Пустой процесс (Empty Process) — не содержит никаких активных компонентов приложения. Единственная причина сохранять такой процесс —
только как кэш, чтобы уменьшить время запуска при вызове компонента. Система уничтожает эти процессы в первую очередь.
Если в одном процессе выполняются несколько компонентов, Android определяет приоритет процесса по компоненту с самым высоким приоритетом. Например, если в процессе выполняется служба и видимая деятельность, процесс будет ранжирован как видимый, а не сервисный процесс.
Если от некоторого процесса зависят другие процессы, его ранг также может быть увеличен. Процесс, который обслуживает другой процесс, никогда не может иметь приоритет ниже, чем процесс, который он обслуживает. Например, если контент-провайдер в процессе А обслуживает клиента в процессе В или если служба в процессе А связана с компонентом в процессе В, то процесс А получит приоритет не меньше, чем приоритет процесса В. ЕСли вам задали заданию по http://mysapr.com, тогда зайдите сюда и посмотрите уроки и чертежи.
Поскольку сервисный процесс имеет ранг выше, чем фоновая деятельность, для выполнения фоновых процессов, требующих длительное время для завершения (например, передачи данных по сети), но которые должны гарантированно завершиться, часто запускают отдельную службу вместо того, чтобы просто породить поток в деятельности. Это важно в случае, если операция передачи данных по сети будет продолжаться больше времени, чем окно деятельности, 4из которой эта операция была запущена, будет оставаться в видимом процессе (будет видима на экране мобильного устройства). По этой же причине приемники широковещательных намерений должны использовать службы, а не просто помещать отнимающие много времени операции в поток.
|