Как обнаружить, что приложение было остановлено
Есть ли какой-нибудь способ обнаружить, что прошлый запуск приложения закончился остановкой (force stop, terminate)? Может быть временный флаг или состояние, то что можно проверить на стороне приложения (не во время, а уже после, с новым стартом). Например, попробовал читать WorkInfo от WorkManager. Но его запрос выживает после остановки приложения.
Хочу использовать для восстановления расписания от AlarmManager. Чтобы не устанавливать всё расписание при каждом запуске. Другие ответы предлагали PendingIntent с флагом FLAG_NO_CREATE (он дает null если интента не существует). Но как оказалось PendingIntent продолжает существовать при запуске после остановки. Хотя alarm уже отменен. Поэтому условие не срабатывает.
Ответы (1 шт):
Один из способов обнаружить, что приложение было остановлено, состоит в том, чтобы сохранять временную метку при каждом старте приложения и сравнивать ее с текущей временной меткой при следующем старте. Если разница между ними больше определенного порога (например, 24 часа), то это может указывать на то, что приложение было остановлено.
Вот пример того, как это можно реализовать:
long lastRunTimestamp = getLastRunTimestamp(); // читаем последнюю сохраненную временную метку
long currentTimestamp = System.currentTimeMillis(); // читаем текущую временную метку
long threshold = TimeUnit.HOURS.toMillis(24); // задаем порог разницы в 24 часа
if (currentTimestamp - lastRunTimestamp > threshold) {
// приложение было остановлено
// здесь вы можете выполнять необходимые действия
// например, восстанавливать расписание от AlarmManager
}
saveLastRunTimestamp(currentTimestamp); // сохраняем текущую временну
Теперь нужно реализовать функции getLastRunTimestamp и saveLastRunTimestamp, которые будут считывать и сохранять временную метку соответственно. Для этого можно использовать, например, SharedPreferences.
Функция getLastRunTimestamp будет выглядеть примерно так:
private long getLastRunTimestamp() {
SharedPreferences prefs = getSharedPreferences("app_prefs", MODE_PRIVATE);
return prefs.getLong("last_run_timestamp", 0);
}
Таким образом, вы можете обнаружить, что приложение было остановлено, сравнивая временную метку предыдущего запуска с текущей временной меткой и выполняя необходимые действия при необходимости. Не забудьте сохранить текущую временную метку после каждого запуска, чтобы использовать ее при следующем запуске.