Реализация таймера в Android, который активен все время (даже во время тайм-аута экрана) - PullRequest
3 голосов
/ 01 ноября 2010

Я реализовал Службу в своем приложении для Android, которая запускает таймер (используя стандартные механизмы java.util.Timer и java.util.TimerTask), чтобы выполнить некоторую обработку в фоновом режиме с заранее заданным интервалом.

public class BackgroundProcessingService extends Service {

private int interval;
private Timer timer = new Timer();

public void onCreate() {
    super.onCreate();
    startTimer();
}

@Override
public void onDestroy() {
    timer.cancel();
    super.onDestroy();
}

public int getInterval() {
    return interval;
}

public void setInterval(int interval) {
    this.interval = interval;
}

private void startTimer() {

    timer.scheduleAtFixedRate( new TimerTask() {

        public void run() {
            // perform background processing        
        }

    }, 0, getInterval());

    ; }

@Override
public IBinder onBind(Intent intent) {
    return null;
}

}

Служба запускается / останавливается моим приложением следующим образом.

backgroundProcessingService = new Intent(getApplicationContext(), BackgroundProcessingService .class);

startService(backgroundProcessingService);

Пока телефон активен (тайм-аут экрана не произошел), служба работает нормально, а таймер выполняет свою работу с заданным интервалом.Даже когда я закрываю приложение (используя кнопку «назад»), таймер остается активным.

Однако, как только время ожидания телефона истекло, задача таймера перестала работать стабильно.Если я оставлю телефон в режиме ожидания на несколько часов (ночью), я увижу, что в случайных случаях (иногда с интервалом в несколько часов) срабатывает таймер.

Кроме того, при повторной активации телефона всезапуски таймера, которые были поставлены в очередь, внезапно выполняются одним выстрелом, прежде чем вернуться к нормальному интервалу.

Каков правильный способ реализации таймера, который продолжает работать должным образом, даже после того, как телефон перешел в таймаут,Должен ли я прибегнуть к использованию PowerManager и WAKE_LOCKS (как описано здесь http://code.google.com/android/reference/android/os/PowerManager.html), или есть другой механизм?

Ответы [ 2 ]

4 голосов
/ 01 ноября 2010

Вот для чего AlarmManager .

0 голосов
/ 22 апреля 2014

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

AlarmManager наверняка не является здесь ответом, но тогда и Handler не является.Вы выполняете Обработчик, когда вас беспокоит наличие запускаемых модулей, которые затем могут действовать в Потоке, отличном от того, в котором вы работаете (как описано в этом ответе Обновление GUI: Runnables vs Messages ).

Реальный ответ заключается в том, что если у вас есть причина рассчитывать время в своем собственном приложении, это означает, что, вероятно, существуют доменные события, которые вам нужно включить в вашу модель, например, если я собираюсь отправлятьэлектронные письма, у меня были бы некоторые события о почтовых состояниях / преобразованиях.Вот что такое «Реактивное программирование»: втягивание процесса реагирования на вещи на уровень разработки программного обеспечения, а не просто планирование, как деталь котельной, которая скрыта под слоем «объектов».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...