Sto scrivendo un'app per lo sport che deve tracciare il tempo trascorso di un quarto/metà/periodo. Il tempo trascorso deve essere accurato al secondo. Il cronometro di gioco deve continuare a funzionare anche se l'utente pone esplicitamente il dispositivo in modalità di sospensione premendo il pulsante di accensione.Timer Android che funziona quando il dispositivo dorme
Il mio primo tentativo di questo ha coinvolto utilizzando Handler.postDelayed() per attivare l'orologio zecche ogni 200ms e WindowManager.LayoutParms.FLAG_KEEP_SCREEN_ON per garantire che l ' "orologio" non è stato fermato da un timeout dello schermo. Ma presto ho appreso che era possibile aggirare questo approccio premendo il pulsante di accensione per mettere manualmente il dispositivo in modalità sospensione. Inoltre, l'approccio postDelayed() sta sperimentando una deriva del clock, apparentemente un risultato del tempo trascorso nel metodo run(). I numeri reali sono ancora accurati, ma invece di essere allineati, ad esempio, su confini di 5 secondi che sono facilmente comprensibili dagli utenti - i timer coinvolti iniziano a subire deriva, causando una comprensibile confusione dell'utente.
Dopo un po 'di ricerca ho trovato le tecniche per l'utilizzo dei servizi, java timers, AlarmManager e PartialWakeLock per implementare i timer. I servizi da soli non risolvono il problema associato al dispositivo che va a dormire. I timer Java, come i servizi, non risolvono il problema con il dispositivo che va a dormire. AlarmManager sembra un buon approccio, ma temo che non si tratti di un uso appropriato di AlarmManager (ovvero intervalli molto brevi tra gli allarmi). Anche l'uso di PartialWakeLock sembra promettente, ma di per sé non affronta il problema della deriva oraria che sto vivendo.
Ho intenzione di provare una combinazione di AlarmManager e PartialWakeLock. L'idea è che AlarmManager aiuterà a combattere la deriva del clock e PartialWakeLock per mantenere il codice semplice (incrociato con le dita). Spero che questo approccio si traduca in un ragionevole equilibrio tra risparmio energetico, complessità del codice e aspettative degli utenti. Qualsiasi consiglio è molto apprezzato.
Grazie,
Rich
utilizzando PartialWakeLock non vedrete alcuna deriva, ma la batteria si scaricherà. – NitZRobotKoder
Hai detto che "il tempo trascorso deve essere preciso al secondo". Perché non usi un semplice tempo di sistema (come System.currentTimeMillis()) ?? Basta salvare il timestamp all'avvio e quindi sottrarlo dall'ora corrente quando necessario – Dmitry