Гарантирован ли сервис android для вызова onDestroy()?
Диаграмма жизненного цикла Activity на андроиде не гарантирует, что onDestroy() будет вызван, но процесс может быть убит, а Activity будет удален внезапно. Диаграмма жизненного цикла службы на андроиде гарантирует, что будет вызван onDestroy(). Поэтому у меня есть два вопроса, касающихся этой разницы.
Во-первых, если Служба является частью того же процесса, что и Activity, называется вызываемой службой onDestroy(), хотя Activity onDestroy() не вызывается? Я думаю, что нет, поскольку "убийство процесса" предполагает, что операционная система останавливает свои потоки и освобождает свои ресурсы.
И если это так, может ли ОС-сервис быть убит операционной системой?
Ответы
Ответ 1
Я не уверен, где вы видите, что Служба, как гарантируется, имеет onDestroy()
. Насколько я знаю, это не так. Если вы читаете эту страницу документов, в ней описываются условия, в которых служба может быть убита. Поэтому, если вы спрашиваете, будет ли убит процесс, который содержит как действие, так и службу, вызывается onDestroy()
в службе (но не в действии), тогда ответ будет отрицательным; услуга onDestroy()
не обязательно будет вызываться. Относительно того, может ли ОС внезапно убить только сервисный процесс: да, это возможно. Это особенно актуально, когда у вас много работы, и ваш вызов onStartCommand
только приостанавливает работу для асинхронного выполнения. Тогда служба будет тратить большую часть своего времени не на защищенные методы onCreate
, onStartCommand
или onDestroy
.
Ответ 2
Можно рассмотреть две вещи:
- Android может решить закрыть процесс в какой-то момент, когда память низкая и требуется другими процессами, которые более немедленно обслуживают пользователя. Таким образом, компоненты приложения, запущенные в процессе уничтожения, уничтожаются. Процесс снова запускается для тех компонентов, когда они снова работают для них. В этом случае
onDestroy()
не называется, поскольку ОС Android снова будет восстанавливать ресурсы (это основная задача OS в целом - в случае, если вы этого не знаете).
- Услуга может быть запущена и связана с ней. В таком случае система будет поддерживать работу службы до тех пор, пока она запущена или есть одно или несколько подключений к ней с помощью флага Context.BIND_AUTO_CREATE. Когда ни одна из этих ситуаций не выполняется, вызывается метод onDestroy() службы, и служба фактически прекращается. Вся очистка (прекращение потоков, незарегистрированные приемники) должна быть завершена по возвращении из onDestroy(). Поэтому, когда ОС Android видит, что Служба закончила свою работу и больше не нужна, она будет уничтожена ОС Android. ОС Android дает разработчику возможность выпускать сервисные ресурсы, чтобы не вызвать утечку памяти. В этом случае
onDestroy()
называется, так как это место, где разработчик может освобождать ресурсы. Конечно, в этом случае процесс приложения остается нетронутым (так как в нем могут быть другие Службы/действия).