Как определить, было ли принудительно закрыто приложение Android?

Мне нужно определить, было ли мое приложение принудительно закрыто, аварийно завершено или завершено нормально. Мой вопрос: как бы вы сделали это в среде Android. Обработка исключений проста, мне нужно только заменить Thread.setDefaultExceptionHandler. Трудная часть: как я могу отличить принудительное закрытие от «нормального» (например, обратное нажатие или кнопка «Домой» + много времени и т. д.)?

Причина в том, что мы можем синхронизировать содержимое локальной базы данных с сервером. И у нас есть веские причины разрешить эту операцию только в состоянии 1 основного действия, а не в состоянии 2. Однако, если пользователь обнаружит в программе некоторую семантическую ошибку, связанную с базой данных, в состоянии 2 основного действия, тогда он или она может застрять там.

Мы готовы к прерыванию входящего вызова и другим изменениям конфигурации, поэтому, если приложение застревает в состоянии 2, принудительное закрытие приложения, а затем его повторное открытие все равно оставит пользователя на этапе 2, а не на этапе 1.

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


person Hegi    schedule 17.07.2013    source источник


Ответы (2)


К сожалению нет способа. Когда пользователь или система принудительно останавливает приложение, весь процесс просто уничтожается. Нет обратного вызова, чтобы сообщить вам, что это произошло. Даже onDestroy() не гарантируется вызов. Это задокументировано в документации: "There are situations where the system will simply kill the activity's hosting process without calling this method (or any others) in it ..."

person Oleksandr Karaberov    schedule 17.07.2013
comment
А как насчет getRuntime().addShutdownHook или что-то в этом роде. Я знаю, что on Android, the application lifecycle does not include VM termination, so calling this method will not ensure that your code is run, но никто не говорит мне, когда он вызывается... Нет ли метода, который я мог бы использовать? - person Hegi; 17.07.2013
comment
@Hegi Как я уже сказал, для этой цели нет гарантированного способа и метода. - person Oleksandr Karaberov; 17.07.2013

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

person Brad    schedule 17.07.2013
comment
чтобы сделать этот ответ действительным, вы должны определить выключение в ОС Android. - person Selvin; 17.07.2013
comment
Это была моя первоначальная идея, но, как упоминалось выше, единственный гарантированный метод, который вызывается, это onPause, и, к сожалению, этот метод также вызывается, когда пользователь нажимает клавишу «домой». - person Hegi; 17.07.2013