Может ли фоновое обслуживание существовать без основного приложения?

Давайте рассмотрим следующий сценарий:

  • Я создал новое приложение для Android с классом приложения, активностью и фоновым сервисом.
  • У меня есть переменная static в классе приложения, скажем, int я = 0;
  • Я запускаю activity и запускаю service из activitie onCreate(), служба получает флаг START_STICKY.
  • Все, что делает этот service, использует TimerTask для записи текущей секунды в переменную класса приложения. 5. Я выхожу из действия
  • Через некоторое время Android убьет эту услугу, а приложение (скажем, что на устройстве мало ресурсов) и перезапустите службу из-за флага START_STICKY.

Теперь у меня есть вопросы:

  • Является ли ситуация, когда ОС убивает приложение, но не убивает службу?
  • Когда служба перезагружается системой, перезапустится и приложение? Если да - какой контекст он будет иметь, а если нет, то как это может быть, что есть служба, работающая без его приложения?

Спасибо, извините за мой страшный английский...

Ответ 1

1. Есть ли ситуация, когда ОС убивает приложение, но не убивает службу?

tl; dr: Да, это возможно. Однако Service должен быть запущен в собственном процессе.

Explaination:

Важно понимать, что ОС Android убивает процессы, когда она работает на низкой памяти, а не отдельные компоненты, такие как Activities или Services (см. этот ответ).

Учитывая приведенное выше утверждение, ясно, что a Service может существовать независимо от Application, только если они содержатся в отдельных процессах. В противном случае они будут уничтожены вместе, когда их процесс будет уничтожен.

Теперь рассмотрим случай Service и Application, существующих в отдельных процессах. В Android процессы разрушаются в ситуациях с низкой памятью с самого низкого приоритета. Порядок приоритетов: Пусто < Фон < Обслуживание < Видимый < Foreground (см. Здесь). Таким образом, возможно, что ваш Application будет уничтожен, пока ваш Service останется в живых (например, если ваше приложение находится в фоновом режиме), и также возможно, что ваш Service будет уничтожен, пока ваше приложение останется в живых (приложение находится в на переднем плане).

Вы можете объявить любой компонент (Activity, Service, ContentProvider и т.д.) приложения для запуска в нем собственного процесса, указав android:process в теге манифеста компонентов.

Из официальной документации Processes:

По умолчанию все компоненты одного и того же приложения запускаются в одном и том же процессе, и большинство приложений не должны изменять это. Однако [...] запись манифеста для каждого типа компонентного элемента - Activity, Service, Receiver и Provider - поддерживает атрибут android:process, который может указывать процесс, в котором этот компонент должен запустить. Вы можете установить этот атрибут так, чтобы каждый компонент работал в своем собственном процессе или чтобы некоторые компоненты совместно использовали процесс, а другие - нет. [...] Элемент Application также поддерживает атрибут android: process, чтобы установить значение по умолчанию, которое применяется ко всем компонентам.


2. Когда служба перезагружается системой, перезапустится и приложение?

Это связано с ответом в вопросе 1.

Если Service существует в том же процессе, что и Application, тогда они оба будут уничтожены и перезапущены вместе.

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

Ответ 2

Является ли ситуация, когда ОС будет убивать приложение, но не будет убивать сервис?

да, такая ситуация, как правило, службы будут убивать после активности, потому что они требуют последних ресурсов из системы читать Docs here

Когда служба перезагружается системой, будет ли приложение перезапустите также?

Я не уверен в этом, но я думаю, что нет, потому что сервис может жить без ссылки на приложение

Ответ 3

Ответ Томера Мор неверен.

Когда ваш Application умирает - ваш Service тоже умирает.

Ваш Service будет создан только после вашего Application. Это вы можете наблюдать, регистрируя их onCreate().