2011-11-16 5 views
8

AlarmManager estados Javadoc de Androidbloqueo de la estela de AlarmManager al iniciar un servicio

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

Hay una (com.example.android.apis.app paquete) AlarmService en las demostraciones del API proporcionadas con Android que demuestran AlarmService en utilizar.

En él tenemos la siguiente (editado para mayor claridad):

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); 

Así que en este ejemplo no lo hace un lugar PendingIntent mAlarmSender = PendingIntent.getBroadcast(...); Se hace un getService el que el Javadoc nunca se alude a.

La razón por la que estoy preguntando sobre esto es debido a las implicaciones del bloqueo de activación de CPU. El Javadoc dice que el bloqueo de activación de AlarmManger se liberará una vez que regrese el onReceive() de un receptor de Broadcast.

Lo que me pregunto es cuáles son las implicaciones de bloqueo de vigilia si utiliza una alarma como en el ejemplo? El Javadoc no parece abordar esto. En todo caso, parece implicar que debes usar la técnica de transmisión cuando estableces alarmas.

Respuesta

6

Lo que me pregunto es cuáles son las implicaciones de bloqueo de activación si utiliza una alarma como en el ejemplo?

No hay garantías de que su servicio obtenga el control antes de que el dispositivo se quede dormido.

En todo caso, parece implicar que debe utilizar la técnica de transmisión al establecer alarmas.

Para _WAKEUP alarmas, sí, ya que es el único camino en el que tenemos garantizado el control mientras el dispositivo está todavía despierto.

Dado que el trabajo a realizar por la alarma _WAKEUP es normalmente más allá del alcance de lo que puede hacer con seguridad en onReceive() de un manifiesto-registrado BroadcastReceiver, un patrón común es delegar el trabajo a un IntentService. Con ese fin, he empacado WakefulIntentService, para implementar el patrón para pasar el control con seguridad a un IntentService y mantener el dispositivo en funcionamiento el tiempo suficiente para que el servicio haga su trabajo.

+0

respuesta perfecta - gran archivo adjunto. Muchas gracias – Tim

+0

también ... ¿cuál es la mejor manera de cancelar un WakefulIntentService? – Tim

+0

@Tim: No estoy seguro de lo que quiere decir con "cancelar un WakefulIntentService". Puede cancelar la alarma mediante 'cancel()' en 'AlarmManager'. – CommonsWare

Cuestiones relacionadas