2011-09-05 10 views
33

Mi aplicación necesita capturar algunos datos de la web a una hora específica cada día. Entonces uso un AlarmManager para programar la tarea y eso funciona bien.¿Debo usar PendingIntent.getService() u getBroadcast con AlarmManager?

Pero cuando se observan varios ejemplos, parece que hay dos formas de tratar con el AlarmManager cuando se trata del intento pendiente.

Uno usa PendingIntent.getBroadcast() para llamar a un receptor de difusión cuando se activa la alarma y dentro de ese receptor se inicia el servicio para hacer el trabajo real.

Otro enfoque es usar PendingIntent.getService() y llamar al servicio directamente cuando se active esa alarma.

¿Puede alguien explicarme la diferencia entre los dos enfoques para que pueda decidir en cuál confiar?

EDIT: Una pregunta más es dónde adquirir el bloqueo de wake cuando se usa getService()?

Por ejemplo, cuando se utiliza un BroadcastReceiver que tienen la siguiente línea en OnReceive():

WakeReminderIntentService.acquireStaticLock(context); 

¿Cómo debería adquirir el bloqueo estela si en lugar de llamar al servicio directamente como:

PendingIntent pi = PendingIntent.getService(this, 0, new Intent(this, OnAlarmReceiver.class), PendingIntent.FLAG_UPDATE_CURRENT); 

¿Debo simplemente adquirirlo desde el servicio en su lugar?

+0

Realmente no importa de una forma u otra. Puede usar IntentService o Service, o un Broadcast local o global. Deberías poder hacer lo mismo en todos ellos. –

Respuesta

16

Uno usa PendingIntent.getBroadcast() para llamar a broadcast receiver cuando la alarma suena y dentro de ese receptor se inicia el servicio para hacer el trabajo real.

que tiene un paso más en el servicio de arranque que

Otro enfoque es utilizar PendingIntent.getService() y llamar al servicio directamente cuando esa alarma se apaga.

entonces usted debe utilizar el segundo enfoque, ya que está reduciendo su ejecución en un paso ..

+1

"entonces deberías usar el segundo enfoque ya que está reduciendo tu paso en la ejecución": si esa es la única diferencia, seguramente sí.Pero me preguntaba si había una diferencia más sutil, algo que pudiera afectar el rendimiento, etc. – marlar

+0

No creo que haya algo más que pueda afectar el rendimiento. –

+0

Gracias. Por favor mira mi pregunta actualizada – marlar

11

La lectura de su edición supongo que usted descubrió a sí mismo: Si desea asegurarse de que se ha iniciado su servicio cuando se usa AlarmManager, es mejor tomar el desvío de enviar primero a un receptor y adquirir un bloqueo de vigilia allí. De lo contrario, es posible que el teléfono se apague antes de que se inicie el servicio solicitado. Eso es lo que dice javadoc of AlarmManager y también lo leí en una publicación por Google engineer.

Ahora para su edición: ¿Cuándo adquirir la cerradura? El objetivo de utilizar el receptor es adquirir el bloqueo dentro del método onReceive() del receptor, porque Android no se quedará dormido durante la ejecución de este método.

Para ver un ejemplo, consulte este question.