2011-09-05 34 views
33

La mia app deve prelevare alcuni dati dal web in un momento specifico ogni giorno. Quindi uso un AlarmManager per pianificare l'attività e funziona bene.Devo usare PendingIntent.getService() o getBroadcast con AlarmManager?

Ma quando si guardano vari esempi, sembra che ci siano due modi per gestire AlarmManager quando si tratta dell'intenzione in sospeso.

Uno usa PendingIntent.getBroadcast() per chiamare un ricevitore di trasmissione quando l'allarme si attiva e all'interno di quel ricevitore viene avviato il servizio per eseguire il lavoro vero e proprio.

Un altro approccio è quello di utilizzare PendingIntent.getService() e chiamare il servizio direttamente quando l'allarme si spegne.

Qualcuno può spiegarmi la differenza tra i due approcci, quindi posso decidere su quale fare affidamento?

MODIFICA: Un'altra domanda è dove acquisire il blocco della sveglia quando si utilizza getService()?

Ad esempio, quando si utilizza un BroadcastReceiver Ho la seguente riga nel OnReceive():

WakeReminderIntentService.acquireStaticLock(context); 

Come devo acquisire il blocco scia se io invece chiamo il servizio direttamente come:

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

Dovrei semplicemente acquistarlo dall'interno del servizio?

+0

Non importa in un modo o nell'altro. È possibile utilizzare IntentService o servizio o una trasmissione locale o globale. Dovresti essere in grado di fare lo stesso in tutti loro. –

risposta

16

Uno usa PendingIntent.getBroadcast() per chiamare un broadcast receiver quando l'allarme si attiva e all'interno di quel ricevitore viene avviato il servizio per eseguire il lavoro vero.

ha un passo in più servizio di avvio di

Un altro approccio è quello di utilizzare PendingIntent.getService() e chiamare il servizio direttamente quando l'allarme si spegne.

quindi si dovrebbe utilizzare il secondo approccio, come si sta riducendo il vostro un passo in esecuzione ..

+1

"allora dovresti usare il secondo approccio in quanto riduce il tuo passo in fase di esecuzione": se questa è l'unica differenza, sicuramente si.Ma mi stavo chiedendo se ci fosse una differenza più sottile, qualcosa che potrebbe avere un impatto sulle prestazioni ecc. – marlar

+0

Non credo che ci sia qualcos'altro che influirà sulle prestazioni .. –

+0

Grazie. Si prega di vedere la mia domanda aggiornata. – marlar

11

Leggendo la tua modifica presumo che hai scoperto da soli: Se si vuole fare in modo che il servizio viene avviato quando si utilizza AlarmManager, è meglio prendere la deviazione del primo invio a un ricevitore e acquisire una serratura sveglia lì. Altrimenti è possibile che il telefono si addormenti prima dell'avvio del servizio richiesto. Questo è ciò che dice il javadoc of AlarmManager e anch'io lo leggo in post da Google engineer.

Quindi ora per la modifica: quando acquisire il blocco? L'intero punto di utilizzo del ricevitore è acquisire il blocco nel metodo onReceive() del ricevitore, perché Android non si addormenterà durante l'esecuzione di questo metodo.

Per un esempio, vedere questo question.