Autore Topic: Di Service, BroadcastReceiver e AlarmManager  (Letto 602 volte)

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Di Service, BroadcastReceiver e AlarmManager
« il: 19 Maggio 2015, 18:40:27 CEST »
0
Qualcuno ha scritto che può accadere che un allarme lanciato da un AlarmManager (anche se di tipo _WAKEUP) potrebbe non risvegliare un Service ma risveglia sempre un BroadcastReceiver.
Dico "risvegliare", ma intendo che l'Intent che lancia l'AlarmManager potrebbe non arrivare alla onStartCommand del Service perché il device va in Sleep subito.

E' vero questo?

Ora, da quanto ne so durante tutta l'esecuzione della onStartCommand il device viene mantenuto "sveglio" e potrebbe addormentarsi all'uscita. Ma possibile che si possa addormentare prima?
E perché questo non dovrebbe avveniree invece prima della onReceive del BroadcastReceiver?

Nel mio Service già gestisco un WakeLock per altri motivi e, a meno che le suddette cose siano vere, non vedo il motivo di passare per un WakefullBroadcastReceiver.
Tra l'altro, se questo vale per gli Intent lanciati dall'AlarmManager, vale anche in altri casi di PendingIntent?

Mi riferisco al fatto che io registro nelle FusedLocationApi un requestLocationUpdates (NoPower) con un PendingIntent, di modo che mi arrivi un Intent ogni qual volta le FusedLocationApi aggiornano la posizione su richiesta di qualche altra App. In quel caso però l'Intent tiene come Extra le posizioni identificate... che a me servono nel Service, non nel BroadcastReceiver.

Qualcuno che ha le idee più chiare delle mie, mi può chiarire un po' come stanno le cose?

Ciao.

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Di Service, BroadcastReceiver e AlarmManager
« Risposta #1 il: 22 Maggio 2015, 17:44:11 CEST »
0
Uhm... nessuno mi sa essere d'aiuto?

Sono stato poco chiaro su qualche punto?

Offline tonno16

  • Utente storico
  • *****
  • Post: 1186
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Di Service, BroadcastReceiver e AlarmManager
« Risposta #2 il: 23 Maggio 2015, 08:40:38 CEST »
0
Non so quanto possa essere utile la mia risposta.

Se dici che potrebbe non richiamare il servicea sempre un Broadcast Receiver si potrebbe richiamare il onStartacommand() direttamente dal onReceice() con contex.startservice()

iClaude

  • Visitatore
Re:Di Service, BroadcastReceiver e AlarmManager
« Risposta #3 il: 23 Maggio 2015, 13:59:28 CEST »
+1
Qualcuno ha scritto che può accadere che un allarme lanciato da un AlarmManager (anche se di tipo _WAKEUP) potrebbe non risvegliare un Service ma risveglia sempre un BroadcastReceiver.
Dico "risvegliare", ma intendo che l'Intent che lancia l'AlarmManager potrebbe non arrivare alla onStartCommand del Service perché il device va in Sleep subito.

E' vero questo?

Sì, è vero. E' anche riportato nel codice sorgente della classe AlarmManager.java:
"<p>The Alarm Manager holds a CPU wake lock as long as the alarm receiver's
41 * onReceive() method is executing. This guarantees that the phone will not sleep
42 * until you have finished handling the broadcast. Once onReceive() returns, the
43 * Alarm Manager releases this wake lock. This means that the phone will in some
44 * cases sleep as soon as your onReceive() method completes.  If your alarm receiver
45 * called {@link android.content.Context#startService Context.startService()}, it
46 * is possible that the phone will sleep before the requested service is launched.
47 * To prevent this, your BroadcastReceiver and Service will need to implement a
48 * separate wake lock policy to ensure that the phone continues running until the
49 * service becomes available".

Quindi non solo va usato un BroadcastReceiver visto che AlamManager tiene un wake lock fino a quando in metodo onReceive non ritorna...
Se tu chiami startService all'interno di onReceive non è detto che il Service venga lanciato prima che il telefono torni a dormire, in quanto startService è asincrono, quindi ritorna subita e onReceive potrebbe terminare prima che il Service venga lanciato.
Ecco perchè scrivono anche:
"47 * To prevent this, your BroadcastReceiver and Service will need to implement a
48 * separate wake lock policy to ensure that the phone continues running until the
49 * service becomes available".

Ciao.

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Di Service, BroadcastReceiver e AlarmManager
« Risposta #4 il: 25 Maggio 2015, 18:22:25 CEST »
0
Quindi non solo va usato un BroadcastReceiver visto che AlamManager tiene un wake lock fino a quando in metodo onReceive non ritorna...
Se tu chiami startService all'interno di onReceive non è detto che il Service venga lanciato prima che il telefono torni a dormire, in quanto startService è asincrono, quindi ritorna subita e onReceive potrebbe terminare prima che il Service venga lanciato.

Grazie mille, cercavo proprio queste informazioni.
Sì, per quello che dici basta usare un WakefulBroadcastReceiver.

Ciao