Дополнительную информацию можно получить здесь: http://developer.android.com/training/basics/activity-lifecycle/stopping.html
Даже если я думаю, что вы уже прочитали это, потому что вы уже изучили жизненный цикл активности, вы можете видеть на первом рисунке, что onDestroy()
вызывается после onStop()
, и этот вызов полностью управляется системой: вы не должны ожидать какого-либо поведения. Система сама решит, КОГДА вызывать этот метод, а иногда этот метод никогда не будет вызываться (см. здесь: http://developer.android.com/reference/android/app/Activity.html). Когда системе понадобится память, ваша активность перейдет в onStop()
и ничего более.
Итак, чтобы ответить на ваш второй вопрос, вы должны прочитать примечание в документации о методе onDestroy()
:
Примечание. Не рассчитывайте, что этот метод вызывается как место для сохранения данных! Например, если действие редактирует данные в поставщике контента, эти изменения должны быть зафиксированы либо в onPause(), либо в onSaveInstanceState. (Комплект), не здесь. Этот метод обычно реализуется для освобождения ресурсов, таких как потоки, которые связаны с активностью, чтобы уничтоженная активность не оставила таких вещей, пока остальная часть ее приложения все еще работает. Бывают ситуации, когда система просто убивает хост-процесс активности, не вызывая в нем этот метод (или любой другой), поэтому его не следует использовать для выполнения действий, которые должны оставаться после завершения процесса.
Так что совершенно ясно, что это плохое место для процесса очистки. Таким образом, вы должны использовать один из методов onPause()
или onStop()
.
onStop()
описан в документации так:
Вызывается, когда вы больше не видны пользователю. Затем вы получите onRestart()
, onDestroy()
или ничего, в зависимости от дальнейшей активности пользователя.
onPause()
описан в документации так:
Вызывается как часть жизненного цикла действия, когда действие переходит в фоновый режим, но (еще) не было уничтожено. [...] Когда действие B запускается перед действием A, этот обратный вызов будет вызываться для A. B не будет создан до тех пор, пока не вернется onPause() A, поэтому не делайте здесь ничего длинного.< /strong> [...] В ситуациях, когда системе требуется больше памяти, она может остановить приостановленные процессы, чтобы восстановить ресурсы.
Теперь мы знаем, что onPause()
предназначен для сохранения ваших данных, а также что после выполнения onPause()
система может завершить ваш процесс. Таким образом, выполнение очистки в onPause()
кажется самым безопасным местом, поскольку вы почти уверены, что оно будет вызываться каждый раз.
Кроме того, как вы можете прочитать, выполнение очистки здесь может замедлить работу вашего приложения, но в любом случае очистка и воссоздание вашей базы данных при каждом усилении/потере фокуса - действительно тяжелый процесс...
Чтобы возобновить: сделайте процесс очистки в методе onPause()
и процесс инициализации в методе onResume()
. Имейте в виду, что ваше приложение может работать очень медленно при таком процессе.
Надеюсь, это поможет вам.
person
mithrop
schedule
24.10.2013