Гарантированно ли служба Android вызывает onDestroy ()?

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

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

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


person user574771    schedule 29.08.2011    source источник


Ответы (2)


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

person kabuko    schedule 30.08.2011
comment
Эта ссылка была тем, что я хотел увидеть. Спасибо! Я был просто сбит с толку, глядя на диаграммы жизненного цикла, потому что одна показывала случай, когда процесс был убит, а другой нет. Однако я думал, что подразумевается последнее. Просто не знала, где проверить свои мысли. - person user574771; 30.08.2011
comment
как тогда получить уведомление, когда вам нужно очистить службу перед выключением? например, я хочу кэшировать какое-то состояние и сбрасывать его в хранилище перед выключением; если мне никогда не скажут, что я выключаюсь, я потеряю свое состояние - нехорошо! - person Michael; 01.04.2013
comment
@Michael. Периодически / всякий раз, когда ваши данные меняются, рекомендуется сбрасывать его в хранилище. Разумный вопрос. На самом деле, если мой простой ответ вас не удовлетворяет, стоит задать свой вопрос по этому поводу, чтобы получить хорошие подробные ответы. - person kabuko; 01.04.2013
comment
@kabuko: нет, это хорошо знать наверняка. Мое первоначальное чтение документации, предложенной наDestroy, будет называться, поэтому я решил, что это сэкономит много времени на батарею и циклы стирания флеш-памяти, чтобы не сбрасывать при изменении состояния, но ... так много для этой идеи. Я решил разделить свое состояние, чтобы нечастые изменения (‹20 раз в день) переходили на внутреннюю вспышку, а более частые (до 1 Гц) - на внешнюю вспышку, которую при необходимости можно заменить. все же недоволен батареей. - person Michael; 01.04.2013
comment
Поэтому, если вы спрашиваете, убивается ли процесс, в котором одновременно находится действие и служба, будет ли вызываться onDestroy () для службы (но не для действия), тогда ответ будет отрицательным; onDestroy () службы не обязательно будет вызываться. Откуда ты это знаешь? Это где-то задокументировано? - person Marian Paździoch; 25.02.2015
comment
@ MarianPaździoch Я не знаю, задокументировано ли это где-нибудь, но уверяю вас, что именно это и происходит - onDestroy не вызывается. - person Dmitry Zaytsev; 03.03.2015
comment
Тогда каким методом мы должны позвонить, чтобы прекратить обслуживание? StopService может не вызывать onDestroy метод, тогда как убивается служба? - person Alston; 22.06.2019

Следует учитывать две вещи:

  1. # P2 #
    # P3 #
  2. # P4 #
    # P5 #
person Marian Paździoch    schedule 26.02.2015
comment
Так? О чем этот комментарий? Вы процитировали часть официальных документов, так? - person Marian Paździoch; 03.03.2015
comment
Я процитировал ту же часть официальных документов, что и вы. Там написано, что Once neither of these situations hold, the service's onDestroy() method is called. Это по-прежнему означает, что даже когда обе ситуации удерживаются, служба не будет просто отключена без вызова onDestroy. И на практике это правда. - person Dmitry Zaytsev; 03.03.2015
comment
Извините, я имел в виду: это по-прежнему означает, что даже когда обе ситуации удерживают сервис, может быть просто уничтожен без вызова onDestory - person Dmitry Zaytsev; 03.03.2015
comment
Какие? Это означает: onDestroy вызывается, когда служба остановлена ​​И к ней больше нет подключений с флагом Context.BIND_AUTO_CREATE. - person Marian Paździoch; 03.03.2015
comment
Да, он вызывается, когда Service останавливается обычным способом (например, через stopSelf). Он не всегда вызывается, когда Service убивается (системой) - person Dmitry Zaytsev; 03.03.2015
comment
Он не всегда вызывается, когда Служба убита (системой). Вы имеете в виду, когда ОС Android убивает сервисный процесс? Конечно, в этом случае он не вызывается. В любом случае, какова была бы цель вызова onDestroy прямо перед тем, как все в любом случае будет уничтожено. - person Marian Paździoch; 04.03.2015
comment
Забавно (не совсем) то, что это может случиться не только тогда, когда весь процесс убит. В нашем приложении есть две службы, одна из которых работает на переднем плане (см. startForeground) и поэтому поддерживается системой. Вторая служба - это фоновая служба (хотя запущена с START_STICKY). Система убивает вторую службу, не вызывая onDestroy, хотя первая служба все еще жива. Оба работают в одном процессе. - person Dmitry Zaytsev; 04.03.2015
comment
Я думаю, что вы делаете что-то неправильно, поскольку я никогда не испытывал такого поведения - Android либо убивает весь процесс (и вам не нужно ни о чем беспокоиться, так как все ваши ресурсы в любом случае возвращаются), либо уничтожает службу (вызовы onDestroy () на нем - вы сами освободили свои ресурсы, поскольку процесс все еще выполняется). Если бы это не сработало, то это было бы бессмысленно, поскольку никто не смог бы освободить ресурсы, и это привело бы к утечкам памяти. Абсурд! - person Marian Paździoch; 16.03.2015
comment
В этом есть смысл, может быть, я был не прав насчет того, что одна служба была уничтожена, а другая сохранилась. Пожалуйста, добавьте свой последний комментарий в текст ответа, чтобы: 1. он был более полным, 2. Я мог изменить свой голос. - person Dmitry Zaytsev; 16.03.2015
comment
Готово, рассмотрите также возможность отрицательного голосования за принятый ответ, поскольку это вообще не ответ :) - person Marian Paździoch; 16.03.2015
comment
Теперь это крутой ответ. Хотя принятый ответ также является правильным, поскольку в основном onDestroy действительно не гарантируется для вызова (как описано в вашем ответе - если процесс убит). - person Dmitry Zaytsev; 16.03.2015