onCreate () и onDestroy () НЕ симметричны? - PullRequest
0 голосов
/ 30 октября 2018

Я изучаю Android и придумал странное наблюдение:

на основе схемы и описания на https://developer.android.com/guide/components/activities/activity-lifecycle Кажется, что два обратных вызова onCreate и onDestroy не являются симметричными.

Кажется, что когда приложение теряет фокус или оказывается в фоновом режиме, система может убить приложение, не вызывая onDestroy. Позже, когда приложение снова запускается, вызывается onCreate.

Я пытался проверить это, но не мог понять, как смоделировать ситуацию, когда система убивала приложение из-за проблем с памятью. Я пытался открыть много приложений на своем телефоне, тестовое приложение никогда не убивалось :)

Допустим, это случается в некоторых случаях. Означает ли это, что вы могли бы вызывать onCreate больше, чем onDestroy, что потенциально может вызвать утечки памяти, если вам случится получить ресурсы в onCreate и освободить onDestroy? Если мои наблюдения верны, есть ли лучшие практики для решения проблем с выпуском ресурса?

Спасибо.

Ответы [ 4 ]

0 голосов
/ 31 октября 2018

Спасибо всем. С помощью советов от @Igor я смог протестировать и доказать точки, упомянутые @Knossos: OnDestroy вызывается, как только приложение теряет фокус. Насколько мне известно, это означает, что onCreate и onDestroy по-прежнему симметричны. Это также означает, что диаграмма на сайте документации Android (https://developer.android.com/guide/components/activities/activity-lifecycle) нуждается в небольшом улучшении.

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

0 голосов
/ 30 октября 2018

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

Просто используйте Настройки-> Параметры разработчика-> Не сохранять режим действий, чтобы постоянно заходить на Дестрой. Также используйте ограничение Фоновый процесс в том же меню.

Свободный вызов onDestroy - экстремальная ситуация. Системные вызовы onDestroy каждый раз, когда активность уничтожается, даже в случае нехватки памяти.

0 голосов
/ 30 октября 2018

Документация действительно может объяснить это лучше .

Однако, вкратце, onDestroy() будет вызываться, если Activity оканчивается на finish() или Android нужны ресурсы, которые использует ваше приложение.

Обычно я не буду использовать onDestroy() для управления ресурсами. На самом деле, я не думаю, что когда-либо использовал onDestroy() в любом написанном мною приложении.

Я буду использовать onPause(), чтобы обеспечить своевременное использование ресурсов. Вам действительно нужно будет сделать это только для зарегистрированных ресурсов (например, BroadcastReceiver). Прекращение повторения Handler сообщений. Такие вещи.

0 голосов
/ 30 октября 2018

Я не уверен, но я думаю, что есть способ смоделировать приложение системного уничтожения с помощью команды adb

https://possiblemobile.com/2017/10/android-testing-app-killed-background/

...