2011-11-16 15 views
8

AlarmManager Javadoc stati di Androidblocco scia di AlarmManager quando si avvia un servizio

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

C'è un (com.example.android.apis.app confezione) AlarmService nelle demo API fornite con Android che dimostrano AlarmService in uso.

In esso abbiamo la seguente (a cura per chiarezza):

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

Quindi, in questo esempio non fa un PendingIntent mAlarmSender = PendingIntent.getBroadcast(...); invece si fa un getService cui il Javadoc mai allude.

La ragione per cui le sto chiedendo è a causa delle implicazioni del blocco della CPU. Javadoc dice che il wake lock di AlarmManger verrà rilasciato quando ritorna il onReceive() di un ricevitore Broadcast.

Quello che mi chiedo sono quali sono le implicazioni del wake lock se si utilizza un allarme come nell'esempio? Il Javadoc non sembra affrontare questo. Semmai sembra implicare che è necessario utilizzare la tecnica di trasmissione quando si impostano gli allarmi.

risposta

6

Quello che mi chiedo sono quali sono le implicazioni del wake lock se si utilizza un allarme come nell'esempio?

Non ci sono garanzie che il servizio ottenga il controllo prima che il dispositivo si addormenti.

Se qualcosa sembra implicare che è necessario utilizzare la tecnica di trasmissione quando si impostano gli allarmi.

Per _WAKEUP allarmi, sì, in quanto è l'unica strada in cui ci sono garantiti per ottenere il controllo mentre il dispositivo è ancora sveglio.

Dal momento che il lavoro da fare per l'allarme _WAKEUP è tipicamente oltre la portata di ciò che si può fare in modo sicuro in onReceive() di un manifesto-registrata BroadcastReceiver, un modello comune è quello di delegare il lavoro ad un IntentService. A tal fine, ho impacchettato WakefulIntentService, per implementare il modello per il controllo sicuro del passaggio su un IntentService e per mantenere il dispositivo sveglio abbastanza a lungo da consentire al servizio di svolgere il proprio lavoro.

+0

risposta perfetta - ottimo allegato. Molte grazie – Tim

+0

anche .. qual è il modo migliore per cancellare un WakefulIntentService? – Tim

+0

@Tim: non sono sicuro di cosa intendi con "annulla un servizio WakefulIntent". È possibile annullare l'allarme tramite 'cancel()' su 'AlarmManager'. – CommonsWare