2013-03-20 10 views
6

Ho un broadcastreceiver chiamato da un allarme (programmato con AlarmManager). In questo ricevitore sto solo interrogando un registro dal database e avviando una notifica. Ho letto che è necessario un wake lock quando viene avviato un servizio o un'attività da un ricevitore broadcast, ma, ho bisogno di un wake lock se voglio solo mostrare una notificacion (nel pannello delle notifiche)?ho bisogno di un wake lock nel mio broadcastreceiver se non sto avviando un servizio o un'attività?

+0

http://stackoverflow.com/a/38816085/6456129 potrebbe essere utile – Yessy

risposta

16

In questo ricevitore sto solo interrogando un registro dal database e avviando una notifica.

Non eseguire l'I/O del database sul thread dell'applicazione principale.

sopra letto che è necessario un blocco scia quando un servizio o un'attività viene avviato da un ricevitore broadcast, ma, ho bisogno di un blocco scia se solo voglio mostrare un notificacion (nel pannello di notifica)?

In generale, no, non avresti bisogno di un WakeLock da un BroadcastReceiver, anche uno che viene richiamato tramite un allarme di _WAKEUP. AlarmManager garantisce in questo caso che manterrà il dispositivo sveglio utilizzando il proprio WakeLock.

Tuttavia, ancora una volta, in questo caso, non si dovrebbe fare l'I/O del database sul thread dell'applicazione principale e onReceive() viene chiamato sul thread dell'applicazione principale. Lo schema corretto qui è che si sposta "l'interrogazione di un registro dal database e l'avvio di una notifica" a IntentService, avviato da BroadcastReceiver, in modo che il lavoro venga eseguito su un thread in background. Questo sarà richiede un WakeLock, come si sta facendo ora di lavoro al di fuori di onReceive(). Ho a WakefulIntentService that manages the WakeLock for you, se vuoi usarlo.

+0

Grazie! Hai risposto a tutte le mie domande a riguardo :) Darò un'occhiata al tuo WakefulIntentService per fare tutto il lavoro in un IntentService e usando un WakeLock. –

+0

correggimi se ho torto, ma penso che ci sia una possibilità che il dispositivo ritorni in modalità di sospensione mentre il dispositivo onReceive() di BroadCastReceiver è terminato, ma il tuo WakefulIntentService non è ancora stato avviato o non ha ancora acquisito un wakelock, quindi Suggerisco semplicemente di usare un WakefulBroadcastReceiver (è stato aggiunto alla libreria di supporto dopo la risposta accettata): http://developer.android.com/reference/android/support/v4/content/WakefulBroadcastReceiver.html –

+0

@ Su-AuHwang : "correggimi se sbaglio" - ti sbagli. 'WakefulIntentService' è progettato specificamente per questo scenario. "quindi suggerirei semplicemente di usare un WakefulBroadcastReceiver" - ci sono pro e contro per ogni approccio; non c'è nulla di intrinsecamente sbagliato in nessuno dei due. – CommonsWare

-1

Sì, è necessario. Ricordo che a livello di kernel, la CPU verrà mantenuta in esecuzione per circa 5 secondi. Quindi, se non riesci a terminare la tua notifica entro 5 secondi, devi afferrare una sveglia. E rilasciarlo dopo aver finito il tuo lavoro.

+0

Grazie per la risposta. Solo una domanda in più: devo iniziare un servizio? o posso fare il lavoro sul ricevitore? –

+0

Downvote perché BroadcastReceiver non può svolgere un duro lavoro (solo pochi secondi, quindi 5 secondi sono davvero buoni). Se vuoi fare un duro lavoro, avvia un servizio. –

Problemi correlati