Я сделал простую программу таймера, которая обновляет текстовое окно каждую секунду. Я хочу, чтобы он подавал звуковой сигнал каждые 10 секунд в течение 100 секунд. Bascially это, как я сделал это (очень схематично):Почему postAtTime не запускается в нужное время, когда экран выключен
static long second, ticker, uptimemilli;
onCreate() {
second = ticker = 0;
Handler mHandler = new Handler();
uptimemilli = SystemClock.uptimeMillis();
mHandler.postAtTime(mUpdateTimeTask, uptimemilli+1000*ticker++);
}
private Runnable mUpdateTimeTask = new Runnable() {
public void run() {
if (second == 100)
return;
UpdateMyTextView(second++);
if (second%10 == 0)
PlayBeep();
mHandler.postAtTime(mUpdateTimeTask, uptimemilli+1000*ticker++);
}
};
Это хорошо работает, когда на дисплее телефона включен. TextView обновляется каждую секунду, и он дает звуковой сигнал каждые 10 секунд. Тем не менее, я хочу, чтобы приложение подавало звуковой сигнал каждые 10 секунд, даже если я выключу дисплей. Проблема в том, что, когда я это делаю (коротким нажатием на кнопку питания), петля таймера, похоже, идет медленным движением. Я получаю звуковой сигнал, возможно, каждые 20-25 секунд. Поэтому postAtTime не работает, когда экран выключен. Кто-нибудь знает, почему и как я могу заставить postAtTime запускаться в то время, которое я укажу, даже когда экран выключен?
Спасибо! Короткий вопрос о последующих действиях. Является ли AlarmManager единственным способом заставить что-то запускать в определенное время после того, как экран потемнеет? – Anders
@Anders: «Есть ли AlarmManager единственный способ заставить что-то запускать в определенное время после того, как экран потемнеет?» - это, безусловно, самый энергоэффективный способ. Все остальное потребует от вас постоянного включения устройства (например, 'WakeLock'). – CommonsWare