Разве ondestroy не всегда вызывается?

Я поместил некоторый код очистки кеша в onDestroy моей активности, но большую часть времени код не выполняется, если я явно не завершу активность через finish().

Изменить: Just read onDestroy вызывается только с finish() или если в системе мало ресурсов. Итак, куда мне нужно поместить мой код очистки кеша? Если я поставлю его в onPause() и пользователь вернется в приложение, кеш будет очищен. На самом деле я храню в кеше важные временные файлы, которые нельзя удалять в onPause.


person yeahman    schedule 26.10.2013    source источник


Ответы (3)


Из документации для разработчиков Android:

защищенная пустота onDestroy ()

Добавлено в уровень API 1. Выполняйте любую окончательную очистку перед уничтожением действия. Это может произойти либо из-за того, что действие завершается (кто-то вызвал для него finish(), либо из-за того, что система временно уничтожает этот экземпляр действия для экономии места. Вы можете различить эти два сценария с помощью метод isFinishing().

Примечание: не рассчитывайте, что этот метод вызывается как место для сохранения данных! Например, если действие редактирует данные в поставщике содержимого, эти изменения должны быть зафиксированы либо в onPause(), либо в onSaveInstanceState(Bundle), а не здесь. Этот метод обычно реализуется для освобождения ресурсов, таких как потоки, связанные с активностью, чтобы уничтоженная активность не оставляла такие вещи, пока остальная часть ее приложения все еще работает. Бывают ситуации, когда система просто убивает хост-процесс активности, не вызывая в нем этот метод (или любой другой), поэтому его не следует использовать для выполнения действий, которые должны остаться после завершения процесса.

Вы можете переместить свой код в onPause() или onStop()

person meda    schedule 26.10.2013
comment
я храню изображения с измененным размером в кеше.. если я сброшу его onstop()/onpause() и приложение возобновит работу, мои изображения с измененным размером будут потеряны.. должен ли я снова изменить их размер? это довольно ресурсоемко - person yeahman; 26.10.2013
comment
Очень просто сохранить изображения onStop(), а затем загрузить их onStart() - person meda; 26.10.2013
comment
я храню изображения с измененным размером во временной папке кеша... пользователь может либо нажать кнопку, чтобы сохранить изображения, либо выйти из приложения, используя кнопку "Назад".... проблема в том, что я хочу очистить/удалить только изображения с измененным размером когда он покидает мое приложение - person yeahman; 26.10.2013
comment
ok onPause вызывается, когда активность не видна пользователю, поэтому можно поместить код туда, а затем восстановить onResume. - person meda; 26.10.2013
comment
так вы говорите, что я удаляю все изображения с измененным размером в onPause и заново создаю их в onResume? может случиться так, что есть 500 изображений ..... каждый раз, когда требуется некоторое время, чтобы изменить их размер, это не очень удобно для пользователя. - person yeahman; 27.10.2013
comment
@yeahman Мой пост — это попытка ответить на ваш вопрос о том, что onDestroy() не звонят, возможно, вам следует добавить больше кода в свой пост или начать новый вопрос. Трудно угадать ваше приложение без кода, я не хочу давать вам плохой совет, вы понимаете, что я имею в виду. - person meda; 29.10.2013
comment
да, спасибо за ответ :) удалось воссоздать изображения с измененным размером, когда это необходимо, спасибо - person yeahman; 30.10.2013
comment
Очередное дурацкое Android-решение, тут не на что смотреть. Получается, что у вас не может быть единственного метода, который вызывается ТОЛЬКО при фактическом уничтожении фрагмента. Обратите внимание, что onStop вызывается, когда пользователь переводит действие в фоновый режим, это не означает, что оно уничтожается. Так глупо, кто принимает эти решения? - person breakline; 22.01.2018
comment
Этот вопрос был для класса Activity, вы должны прочитать в жизненный цикл фрагмента есть способ onDetach() - person meda; 22.01.2018

попробуй использовать onstop

как это

@Override
    protected void onStop() {
        super.onStop();
       //write your code here
    }
person Mohsen fallahi    schedule 26.10.2013

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

person Markko    schedule 26.10.2013
comment
onDestroy() не вызывается в случае принудительного закрытия. - person Simon; 26.10.2013
comment
Он также не вызывается при удалении приложения путем смахивания последних приложений. По крайней мере, в большинстве случаев иногда это срабатывает. Мне действительно интересно, что именно должно войти в этот обратный вызов. - person Zackline; 19.02.2016