Страницы

Поиск по вопросам

пятница, 7 июня 2019 г.

Отличие службы процесса переднего плана и видимого процесса

В чём заключается отличие службы процесса переднего плана и службы видимого процесса?
В документации написано:
Процесс считается процессом переднего плана, если выполняется любое из следующих условий: ... Он содержит службу Service, связанную с действием, с которым взаимодействует пользователь. Он содержит службу Service, которая выполняется "на переднем плане", — службу, которая называется startForeground(). Он содержит службуService, которая выполняет один из обратных вызовов жизненного цикла (onCreate(), onStart() или onDestroy()). ...
и
Процесс считается видимым, если выполняется любое из следующих условий: ... Он содержит службу Service, связанную с видимым действием или действием переднего плана.
И мне непонятно, в чём отличие этих служб, т.к. для того, чтобы процесс считался видимыми, служба должна быть связана "с видимым действием (1) или действием переднего плана (2)", но и ведь и для процесса переднего плана написано, что "он содержит службу Service, связанную с действием, с которым взаимодействует пользователь" (это ведь = 1?) или "которая выполняется "на переднем плане" (и это = 2?). Разве это не одно и то же?


Ответ

Действительно, несмотря на то, что перевод размещен на официальном сайте, сделан он крайне нечитаемым. Более того, в общем-то понять смысл понятий процесса переднего плана и видимого процесса довольно проблематично. Попробую представить свою версию перевода данной части документации с небольшими дополнениями.
Процесс переднего плана - процесс, необходимый для текущей деятельности пользователя. Различные компоненты приложения (Activity, Service, BroadcastReceiver) могут привести к тому, что содержащий их процесс будет рассматриваться как процесс переднего плана. Процесс считается процессом переднего плана, если выполняется любое из следующих условий:
он содержит Activity, с которым взаимодействует пользователь (вызван метод Activity onResume() т.е. Activity видимо и находится на переднем плане); он содержит запущенный в данный момент приемник широковещательных сообщений BroadcastReceiver, т.е. выполняется метод onReceive(). Приёмник широковещательных сообщений является активным только во время выполнения этого метода. Процесс, который в настоящее время выполняет BroadcastReceiver, т. е. выполняющийся в настоящее время код в методе обратного вызова onReceive(), как полагает система, является приоритетным процессом и будет сохранён, кроме случаев критического недостатка памяти в системе. Когда программа возвращается из метода onReceive(), приёмник становится неактивным и система полагает, что работа объекта BroadcastReceiver закончена. Процесс с активным широковещательным получателем защищён от уничтожения системой. Однако процесс, содержащий неактивные компоненты, может быть уничтожен системой в любое время, когда память, которую он потребляет, будет необходима другим процессам; он содержит службу Service, которая выполняет один из обратных вызовов жизненного цикла (onCreate(), onStart() или onDestroy()). Несмотря на то, что метода onStart() в Service нет, в целом речь идет о том, что он относится к процессу переднего плана от момента его создания, до уничтожения. Внимание! Исключением является запуск Service при помощи метода Service.startForeground(), в этом случае он относится к видимым процессам.
Обычно одновременно работает лишь несколько процессов переднего плана. Они уничтожаются только в крайнем случае, если памяти остается так мало, что они не могут продолжать совместную работу. Обычно в этот момент устройство достигло состояния разбиения памяти на страницы, поэтому для того, чтобы пользовательский интерфейс откликался на действия пользователя, необходимо удаление некоторых процессов переднего плана.Следует отметить, что в теории к этому моменту уже должны быть завершены все видимые процессы.
Видимые процессы – это процессы, которые не содержат компонентов приложения, которые бы относили его к процессу переднего плана, но которые могут влиять на отображение на экране. Процесс считается видимым, если выполняется любое из следующих условий:
он содержит Activity, которое не находится на переднем плане, но видно пользователю (вызван метод onPause()). Например, это может происходить, если из Activity было запущено диалоговое окно, которое позволяет видеть Activity позади него; он содержит службу Service, запущенную при помощи метода Service.startForeground() (т.е. является службой, о которой пользователь активно осведомлен). Service, запущенный таким образом, должен выводить уведомление в строку состояния, которая находится под заголовком «Постоянные». Это означает, что уведомление не может быть удалено, пока служба не будет остановлена или удалена. И здесь при переводе несколько «запутывает» метод, которым вызывается сервис (startForeground()) т.к. его название непосредственно перекликается с названием процесса - foreground process. Но несмотря на такое совпадение служба запущенная при помощи Service.startForeground() все же относится к видимым процессам; он содержит службу, которую система использует для определенной функции, о которой знает пользователь, например, живые обои, метод ввода и т. д.
Видимые процессы считаются исключительно важными, и они удаляются только в том случае, если требуется сохранить работу всех процессов переднего плана.

Комментариев нет:

Отправить комментарий