Периодически запускать задание с некоторыми исключениями
Мне нужно, чтобы приложение для Android делало что-то в определенное время суток, например, в 8:00 вечера приложение должно выйти из системы. Я не хочу использовать AlarmManager, потому что он срабатывает, даже если приложение не запущено. также, если телефон был перезапущен из выключенного графика работы диспергаторов. Обработчик с Runnable будет очень хорош, но если телефон заснет, он не будет работать. Итак, что мне нужно, это:
- Приложение делает что-то в указанное время (что сохраняется в настройках)
Это должно происходить только в том случае, если приложение запущено и вошло в систему (даже телефон спит)
Что вы можете предложить?
Редакция:
Также эта задача должна подождать, пока приложение не завершит свою другую работу (отправка, получение данных), даже лучше, если она выполняется только в определенном действии (например, дома или на главном, где не выполняется другая работа)
1 ответ
Единственный способ разбудить телефон, когда он спит, с помощью AlarmManager. Другого пути нет (хорошо, вы могли бы удерживать блокировку от будильника и не допустить перехода телефона в спящий режим, но это излишне разряжало бы батарею, и ваши пользователи были бы недовольны).
Таким образом, вы хотите запланировать тревогу с помощью AlarmManager. Затем, когда сработает сигнализация, вы можете проверить, запущено ли приложение и вошли ли в него (сохраните эту информацию в виде некоторых статических (ckass) переменных). Если приложение еще не запущено и не вошло в систему, просто ничего не делайте.
РЕДАКТИРОВАТЬ: Добавить пример кода
Создайте общедоступную статическую (классовую) переменную, к которой могут обращаться все классы в вашем приложении:
public class Globals {
public static boolean applicationIsBusyDoingSomethingUseful = false;
}
В вашем приложении, когда оно делает что-то полезное и не хочет прерываться или выходить из системы из-за тревоги по таймеру, оно должно установить для этой переменной значение "true", и когда оно завершит свою работу и больше не будет что-нибудь полезное, это должно сбросить переменную на "ложь":
public void someUsefulWork() {
// set flag while doing useful work
Globals.applicationIsBusyDoingSomethingUseful = true;
// do useful work
// ...
// end of useful work
Globals.applicationIsBusyDoingSomethingUseful = false;
}
В вашем BroadcastReceiver, когда сработает будильник, вы можете проверить, делает ли приложение что-нибудь полезное. Если это так, вы просто игнорируете будильник и ждете следующего. Если это не помогает, вы выходите из системы.
public class MyAlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Check if application is doing anything useful
if (Globals.applicationIsBusyDoingSomethingUseful) {
// Application is busy working, so ignore this alarm
} else {
// Log the user out or whatever...
}
}
}