Более конкретно: безопасно ли отменить задачу в onDestroy? Кроме того, безопасно ли использовать onDestroy для регистрации регистраторов и освобождения ресурсов?
Моя цель - убедиться, что моя задача отменена/уничтожена, когда действие уничтожено, но не раньше.
OnDestroy():
- вызывается, когда действие уничтожается, а ресурсы должны быть освобожден.
- НЕ вызывается, когда действие уничтожается в спешке (когда система низкая на ресурсах и т.д.).
Первый случай ясен: я делаю всю очистку в onDestroy и никаких проблем не возникает. Второй случай - проблема. Когда Activity уничтожается и onDestroy пропускается (поэтому я не отменяю свою задачу), может случиться, что задача продолжает выполнение, затем завершает работу и пытается обновить мертвую активность, поэтому приложение сработает?
Мы подошли к реальному вопросу:
- Когда активность убита и onDestroy пропущен, все, что связано с этим действием, автоматически уничтожается? (Is onDestroy пропустил только в случае, что все будет полностью уничтожено "Задачи, зарегистрированные приемники и т.д.)
- Если onDestroy пропущен, значит ли это, что убито целое приложение?
Давайте сосредоточимся на onDestroy(), потому что решение не находится в onPause() или onStop(). Аргументы:
- onStop() может быть пропущен при уничтожении Activity, так же как onDestroy
- onPause вызывается слишком рано и слишком часто, поэтому это не подходит для использования. Примеры:
Блокировка экрана: onPause может вызываться, когда экран устройства заблокирован. Очень часто это происходит как заставка, и пользователь разблокируется сразу, потому что он стоит там, глядя на экран. Отмена задач и прекращение всего, что делает мое приложение в таком случае, только ухудшат работу пользователя. Я не хочу, чтобы мое приложение задыхалось и плохо себя вел из-за случайного "заставки".
В примере приложения у меня есть два экрана, которые представляют собой действия. Пользователь может быстро переключаться между ними. В этом приложении пользователи часто и быстро переключают экраны.
Навигация. На одном из экранов есть карта, которая получает обновления местоположения из системы. Он записывает точный графический журнал изменений в местоположении (маршруте), поэтому он должен работать постоянно, пока активность не будет закрыта. Обычно я регистрирую и отменю регистрацию любых получателей в onResume и onPause. Однако это сделает приложение непригодным для использования, поскольку обновления на карте будут останавливаться каждый раз, когда пользователь будет перемещаться. Поэтому я хотел бы отменить регистрацию получателей в onDestroy.
Загрузка списка. На втором экране есть список, отображающий данные из веб-службы. Данные загружаются за 4 секунды. Я использую AsyncTask, и я знаю, что я должен отменить, когда это необходимо. Он не должен отменяться в onPause, потому что он должен продолжать загрузку, когда пользователь переключается между экранами. Поэтому я хотел бы отменить его в onDestroy.
Может быть еще много примеров. Некоторые из них могут не соответствовать всем мнениям (вы можете даже предложить использовать службу вместо AsyncTask). Но идея важна, и все они имеют одинаковую идею: продолжайте выполнять работу, специфичную для Activity, в то время как Activity приостановлена, но ENSURE, чтобы остановить ее, когда Activity уничтожена. (Не имеет значения, пользуюсь ли я AsyncTask или службой. В любом случае работа должна быть остановлена при уничтожении Activity.)
P.S. Если ответ заключается в том, что очистить в onDestroy небезопасно, это означает, что инфраструктура Android требует от нас прекратить все, что мы делаем в onPause. И тогда я не увижу причин для использования onDestroy...