Периодически запускать задание с некоторыми исключениями

Мне нужно, чтобы приложение для 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...
        }
    }
}
Другие вопросы по тегам