Я реализовал Службу в своем приложении для 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), или есть другой механизм?