Почему postAtTime не запускается в нужное время, когда экран выключен - PullRequest
0 голосов
/ 03 марта 2012

Я сделал простое приложение таймера, которое обновляет просмотр текста каждую секунду. Я хочу, чтобы он каждые 10 секунд издавал звуковой сигнал общей продолжительностью 100 секунд. Вот как я это сделал (очень схематично):

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

1 Ответ

2 голосов
/ 03 марта 2012

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

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

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

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

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

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

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

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

...