13

Ho un'attività con alcuni Handlers che vengono eseguiti a intervalli non più di 5 minuti. L'attività viene avviata da uno BroadcastReceiver e può essere avviata con lo schermo spento in attesa che l'utente prenda il telefono e ottenga l'input dell'utente, quando ciò accade, l'attività onPause() viene chiamata così sicuramente la CPU è in modalità di sospensione. Non ho impostato l'attività per attivare lo schermo perché voglio risparmiare più batteria possibile.Un handler postDelayed non viene attivato quando la CPU dorme?

L'ho provato con il mio telefono e funziona molto bene, mentre lo schermo è spento tutto Handlers esegue tutto il codice che devono eseguire. Se accendo e spengo lo schermo mentre l'attività è aperta, tutto funziona correttamente.

Ora, ho letto ovunque che alcuni dispositivi non funzionano come previsto quando lo schermo si spegne e la CPU dorme, il più delle volte con gli accelerometri. Ora la mia domanda è, ho bisogno di acquisire un WakeLock così la CPU non dorme mentre la mia attività è aperta? Voglio davvero saperlo perché, come ho detto prima, non voglio "sprecare" la batteria acquistando un costoso WakeLock.

Preferirei una risposta dettagliata di una persona che sa davvero come funziona.

+0

E perché si utilizzano le attività per eseguire attività in background? Un'attività viene utilizzata per visualizzare cose e non eseguire attività. Hai esaminato i servizi? – tolgap

+0

No no, l'attività non sta facendo attività in background. È un'attività che si apre con un ricevitore Broadcast in attesa che l'utente controlli il telefono e lo veda, ma non voglio aggiungere il flag 'KEEP_SCREEN_ON', ecco perché a volte l'attività è aperta con lo schermo spento (o lo schermo si spegne mentre l'attività è aperta). –

risposta

20

Il tuo obiettivo non può essere raggiunto in modo stabile. Se si utilizza il metodo postDelayed() di Handler e la CPU va in deepsleep, il contatore ms si fermerà e continuerà solo se la CPU si riattiva di nuovo.

See this for more detail.

Quindi, se si vuole avere un qualche tipo di un processo di cron è necessario utilizzare Wakelock. Fortunatamente c'è un'implementazione Servizio che fa esattamente questo: Wakeful IntentService

Dal doc:

Il modello raccomandato per equivalente di Android a cron posti di lavoro e le attività pianificate di Windows è quello di utilizzare AlarmManager. Funziona bene se accoppiato con un IntentService, poiché il servizio farà il suo lavoro su un thread in background e si spegnerà quando non ci sarà più lavoro da fare. C'è un piccolo problema: IntentService non fa nulla per mantenere il dispositivo sveglio. Se l'allarme era una variante WAKEUP, il telefono rimane attivo solo mentre il BroadcastReceiver che gestisce l'allarme si trova nel suo metodo onReceive(). In caso contrario, il telefono potrebbe riaddormentarsi. WakefulIntentService tenta di combatterlo combinando la facilità di IntentService con un WakeLock parziale.

+0

Non male, ma non soddisfa i miei requisiti, mantiene semplicemente la CPU con un WakeLock, come faccio io. La domanda è: ho davvero bisogno di quel WakeLock parziale per far funzionare i miei Handler mentre lo schermo è spento e l'attività è scaduta? Nel mio dispositivo funziona senza WakeLock, ma non so se questo è il modo in cui funzionano tutti i telefoni Android o dipende dalle specifiche del dispositivo. Se è così, voglio sapere chi l'ha detto, o dove appare nella documentazione, perché non riesco a trovare nulla. Grazie per la risposta, che sarà utile per alcune altre cose, CWAC ha alcune librerie interessanti. –

+0

In qualità di altenativo, hai provato AlarmManager.setInexactRepeating(), un allarme ripetuto di protezione dell'alimentazione che invia un Intento quando l'allarme si spegne? http://developer.android.com/reference/android/app/AlarmManager.html – for3st

+0

Alcuni gestori esegue 2/3 volte al secondo, quindi penso che usare AlarmManager sia una cattiva idea. Ho tutto bene e lavoro e non consuma molta batteria, ma se riesco a far sì che l'app consumi meno batteria rimuovendo WakeLock, allora lo farò. L'unica e principale domanda è se ho davvero bisogno di usare un WakeLock perché nella documentazione ufficiale non ho letto da nessuna parte che ho bisogno che funzioni per i gestori e nel mio telefono l'app funzioni perfettamente senza WakeLock, ma non so come Funzionerà su altri dispositivi perché l'unico dispositivo Android che posso utilizzare è mio: -/ –