Будильник LockManager при запуске службы - PullRequest
8 голосов
/ 16 ноября 2011

Android AlarmManager Javadoc сообщает

When an alarm goes off, the Intent that had been registered for it is broadcast by the system,

В демоверсиях API есть AlarmService (пакет com.example.android.apis.app)поставляется с Android, которые демонстрируют использование AlarmService.

В нем мы имеем следующее (отредактировано для ясности):

PendingIntent mAlarmSender = PendingIntent.getService(AlarmService.this,
            0, new Intent(AlarmService.this, AlarmService_Service.class), 0);
AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 30*1000, mAlarmSender);

Так что в этом примере он не делает PendingIntent mAlarmSender = PendingIntent.getBroadcast(...);, вместо этого он делает getService, который Javadocникогда не ссылается на.

Причина, по которой я спрашиваю об этом, связана с последствиями пробуждения CPU.В Javadoc говорится, что блокировка будильника AlarmManger будет снята после возврата onReceive() получателя широковещательной рассылки.

Что мне интересно, каковы последствия блокировки пробуждения, если вы используете сигнал тревоги, как в примере?Javadoc, кажется, не решает эту проблему.Во всяком случае, кажется, что вы должны использовать технику вещания при установке будильника.

1 Ответ

6 голосов
/ 16 ноября 2011

Что мне интересно, каковы последствия блокировки пробуждения, если вы используете сигнал тревоги, как в примере?

Нет никаких гарантий, что ваша служба получит контроль до того, как устройство уснет.

В любом случае это означает, что при настройке будильника необходимо использовать технику вещания.

Для _WAKEUP сигналов тревоги, да, поскольку это единственный путь, по которому мы можем получить контроль, пока устройство еще не активировано.

Поскольку работа будетсигнал тревоги _WAKEUP, как правило, выходит за рамки того, что вы можете безопасно сделать в onReceive() зарегистрированного манифеста BroadcastReceiver, общий шаблон - делегировать работу IntentService.С этой целью я упаковал WakefulIntentService, чтобы реализовать шаблон для безопасной передачи управления на IntentService и поддержания устройства в бодрствующем состоянии достаточно долго, чтобы служба могла выполнять свою работу.

...