Сколько времени может быть потрачено внутри onDestroy (), прежде чем активность будет убита? - PullRequest
2 голосов
/ 21 октября 2010

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

Скажем, у меня есть приложение для Android поверх стека промежуточного программного обеспечения.В onCreate () моей деятельности я инициализирую свои модули промежуточного программного обеспечения.

В его onDestroy () я должен деинициализировать промежуточное ПО.Теперь мои вызовы промежуточного программного обеспечения могут занять некоторое время для обработки.Поэтому я хочу знать, сколько времени занимает функция onDestroy (), и посмотреть, может ли моя деинициализация произойти в течение этого времени.

Разумно ли сохранять мой деинициализированный в onDestroy ()?*

Также предположим, что я инициализирую промежуточное ПО в onCreate () действия A1.При нажатии кнопки действие A1 переключается на действие A2.В ситуациях с нехваткой памяти LMK уничтожит активность, которая не использовалась в течение некоторого времени.В таком случае разве активность А1 не будет убита?Когда действие A1 будет убито, все ли экземпляры, которые я создаю в A1, также будут уничтожены?

С уважением, кики

Ответы [ 2 ]

4 голосов
/ 21 октября 2010

Я полагаю, что вы довольно смущены, задавая этот вопрос.

Чтобы хорошо понять происходящее, вам следует взглянуть на графики жизненного цикла, которые можно найти на developer.android.com:

Вы увидите, что Activity.onDestroy()вызывается только в случае контролируемого завершения действия - что происходит крайне редко, поскольку ОС Android может уничтожить ваш процесс в различных состояниях, даже не вызывая ваш метод onDestroy().

Что ипочему вам нужно деинициализировать?

  • Если вы беспокоитесь об освобождении ресурсов, тогда большинство из них будут освобождены в любом случае, когда / если ваш процесс будет убит.
  • Есливы беспокоитесь о сохранении данных пользователя (состояния вашего приложения), тогда вам следует переопределить onSaveInstanceState() и onRestoreInstanceState()

Если вы действительно хотите получить ответ на свой вопрос, то вот оно:

  • Пока оно работает onDestroy(), у вашего приложения (возможно) столько времени, сколько ему хотелось бы - тот факт, что оно даже работает onDestroy(), означает, что ОС не выбрала его для уничтожения,Но это, скорее всего, не будет иметь значения: например, onDestroy никогда не будет работать в большинстве приложений, и если ОС передумает и решит, что ваше приложение должно умереть, оно убьет его, даже если оно работает onDestroy.
3 голосов
/ 21 октября 2010

http://developer.android.com/guide/practices/design/responsiveness.html:

В Android система защищает от приложения, которых недостаточно реагировать на некоторое время отображение диалога для пользователя, называется приложение не отвечает (ANR) диалоговое окно

Обычно появляется диалоговое окно ANR, если приложение не отвечает в течение 5 секунд. Как указал jhominal, метод onDestroy(), вероятно, не там, где вы хотите выполнить очистку / сохранить настройки / и т.д.

Независимо от того, где вы решите это сделать, будь то onDestroy(), onSaveInstanceState() или onPause(), я считаю, что будет применяться общее правило 5 секунд. Если то, что вы делаете, занимает более 5 секунд, появится диалоговое окно ANR, и пользователь сможет принудительно закрыть ваше приложение.

Edit: Если ваше приложение находится в фоновом режиме, возможно (возможно?), Что оно будет убито напрямую без отображения диалогового окна ANR, если вы нарушите правило 5 секунд. Но я не знаю этого наверняка, только предполагая.

...