2012-03-03 3 views
0

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

ответ

2

Проблема в том, что когда я это делаю (коротким щелчком по кнопке питания), таймер, похоже, идет медленным движением. Я получаю звуковой сигнал, возможно, каждые 20-25 секунд.

Единственная причина, по которой вы даже получаете это, - это то, что что-то другое заставляет устройство снова включать питание каждые 20-25 секунд. Вскоре после того, как экран погаснет, процессор отключится, и ваше приложение больше не будет работать.

Таким образом, postAtTime не работает, когда экран выключен.

postAtTime() работает отлично. Устройство находится в спящем режиме.

Кто-нибудь знает, почему

Поскольку устройство находится в спящем режиме.

Как я могу заставить postAtTime запускаться в то время, которое я указываю, даже когда экран выключен?

Остановите устройство от перехода в спящий режим, например, через android:keepScreenOn.

+0

Спасибо! Короткий вопрос о последующих действиях. Является ли AlarmManager единственным способом заставить что-то запускать в определенное время после того, как экран потемнеет? – Anders

+0

@Anders: «Есть ли AlarmManager единственный способ заставить что-то запускать в определенное время после того, как экран потемнеет?» - это, безусловно, самый энергоэффективный способ. Все остальное потребует от вас постоянного включения устройства (например, 'WakeLock'). – CommonsWare

Смежные вопросы