Ответ 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.