Гарантируется ли вызов службы Android для onDestroy ()? - PullRequest
50 голосов
/ 30 августа 2011

Диаграмма жизненного цикла действия на андроиде не гарантирует, что будет вызван onDestroy (), но процесс может быть завершен, а действие удалено внезапно. Диаграмма жизненного цикла Сервиса на Android действительно гарантирует, что onDestroy () будет вызван. Итак, у меня есть два вопроса, касающихся этой разницы.

Во-первых, если служба является частью того же процесса, что и операция, вызывается ли служба onDestroy (), хотя не вызывается операция onDestroy ()? Я думаю, что нет, поскольку «уничтожение процесса» предполагает, что операционная система останавливает свои потоки и высвобождает свои ресурсы.

И если это так, может ли процесс, только для службы, быть внезапно уничтожен ОС?

Ответы [ 2 ]

31 голосов
/ 30 августа 2011

Я не уверен, где вы видите, что для Сервиса гарантированно вызывается onDestroy(). Насколько я знаю, это не так. Если вы прочитаете эту страницу документации, она описывает условия, при которых служба может быть убита. Поэтому, если вы спрашиваете, уничтожается ли процесс, в котором размещены и действие, и служба, будет ли onDestroy() вызываться в службе (но не в активности), тогда ответ будет отрицательным; услуга onDestroy() не обязательно будет вызываться. Относительно того, может ли процесс, работающий только для службы, быть внезапно уничтожен ОС: да, может. Это особенно верно, когда у вас много работы, и ваш onStartCommand вызов только ставит в очередь работу, выполняемую асинхронно. Тогда служба будет проводить большую часть своего времени не в защищенных onCreate, onStartCommand или onDestroy методах.

11 голосов
/ 26 февраля 2015

Есть две вещи, которые следует учитывать:

  1. Android может решить закрыть процесс в какой-то момент, когда памяти мало и требуется другим процессам, которые более непосредственно обслуживают пользователя. Компоненты приложения, работающие в убитом процессе, впоследствии уничтожаются. Процесс снова запускается для этих компонентов, когда для них снова есть работа. В этом случае onDestroy() не называется , так как ОС Android в любом случае будет восстанавливать ресурсы (это основная задача ОС в вообще - если ты этого не знаешь).
  2. Служба может быть запущена и иметь связанные с ней подключения. В таком случае система будет поддерживать работу службы до тех пор, пока она либо запущена, либо имеется одно или несколько подключений к ней с флагом Context.BIND_AUTO_CREATE. Если ни одна из этих ситуаций не выполняется, вызывается метод onDestroy () службы, и служба эффективно завершается. Вся очистка (остановка потоков, отмена регистрации получателей) должна быть завершена после возврата из onDestroy (). Поэтому, когда ОС Android увидит, что Служба завершила свою работу и больше не нужна - она ​​будет уничтожена ОС Android. ОС Android дает разработчику возможность освободить ресурсы Сервиса, чтобы не вызвать утечку памяти. В этом случае onDestroy() называется , поскольку именно здесь разработчик может высвободить ресурсы. Конечно, в этом случае процесс приложения остается неизменным (поскольку в нем могут выполняться другие службы / действия).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...