setExactAndAllowWhileIdle – non è esatta come riferimento allo sviluppatore

AlarmManager su API19 ha il metodo setExact () per impostare un allarme esatto.

Metodi esatti -> Se ho impostato un allarme a 2:01 pm verrà triggersto alle 2:01 pm

  • Android: Difficoltà a iniziare un frammento all'interno di un frammento
  • Problema di performance sul tipo di carattere TextView
  • Come get il path image catturato dalla camera
  • Come devo superare l'onDraw di VideoView per avere angoli arrotondati trasparenti?
  • "Hai già posseduto questo elemento" ma getPurchases è vuoto
  • Come stabilisce la linea di base di impostazione al falso per migliorare le performance in LinearLayout?
  • Su API 23 – Marhsmwallow (6.0) c'è un nuovo metodo setExactAndAllowWhileIdle () , ma dal riferimento non è esatto poiché innescherà solo each minuto e in modalità standby a bassa potenza solo each 15 minuti .

    Esatto! = Ogni 15 minuti 🙂

    Quindi, come posso get un allarme esatto con AlarmManager in 6.0 ?

    Se un utente aggiunge un promemory o un appuntamento di calendario e vuole essere informato 10 minuti prima dell'evento, dovrebbe mostrare l'allarme EXACT 10 minuti prima dell'evento. Con setExactAndAllowWhileIdle () questo sembra imansible.

    Link di riferimento: http://developer.android.com/reference/android/app/AlarmManager.html#setExactAndAllowWhileIdle(int, lungo, android.app.PendingIntent)

  • Come far funzionare Alarm Manager quando Android 6.0 in modalità Doze?
  • AlarmManager non può funzionare su android 6.0
  • Crash casting AndroidKeyStoreRSAPrivateKey su RSAPrivateKey
  • 5 Solutions collect form web for “setExactAndAllowWhileIdle – non è esatta come riferimento allo sviluppatore”

    Quindi, come posso get un allarme esatto con AlarmManager in 6.0?

    Siete benvenuti a provare setAlarmClock() , in quanto AFAIK non è influenzato dalla modalità Doze. Altrimenti, AlarmManager non è un'opzione valida per te. Anche la tua applicazione sul whitelist di ottimizzazione della batteria non aiuterà, poiché il comportmento di AlarmManager non cambia in base al whitelist.

    Siete invitati a utilizzare GCM, poiché un messaggio di priorità alta dovrebbe darvi l'opportunità di avvisare l'utente. Naturalmente, questo richiede la connettività di networking.

    L'unica soluzione offline di cui sono a conoscenza – e che sto attualmente sperimentando – è che l'utente abbia aggiunto l'applicazione al whitelist di ottimizzazione della batteria, quindi utilizzi un servizio in primo piano (per cercare di mantenere il process in giro), un servizio ScheduledExecutorService la tempistica) e un WakeLock parziale (per mantenere la CPU accesa). Questo sarà abbastanza devastante per la batteria dell'utente.

    L'utilizzo di setExactAndAllowWhileIdle () per un allarme di una volta sparerà esattamente in quella data anche in modalità di rest Doze. Quindi probabilmente è il modo di andare.

    Problemi iniziano, se si desidera ripetere l'allarme ad una velocità di <15 min (o impostare qualsiasi altra alla volta <15 minuti dall'ultima) , poiché questo non funziona in Doze inattivo, where tali allarmi sono forzati per i prossimi 15 minuti o vengono eseguiti quando inizia la manutenzione intriggers, che avviene per circa dieci minuti prima dopo un'ora, poi dopo altri 2 ore, poi dopo altri 4 ore e così via.

    – EDIT –

    A partire da oggi, il 17 novembre, Dianne Hackborn scrive nei commenti di questo post : " Per quello che vale la pena, il tempo minimo tra i quali gli allarmi inattivi cambieranno a 9 minuti ad un certo punto relativamente presto (anche sui dispositivi che eseguono le correnti Marshmallow correnti) . "

    Ciò non cambia niente di fondamentale però.

    Ecco la mia discussione con Ian Lake su Google+!

    setExactAndAllowWhileIdle () è esatto e dovrebbe funzionare. Il tempo di 15 minuti è errato nel documento java.

    immettere qui la descrizione dell'immagine

    Ho scoperto che finora l'opzione migliore è quella di utilizzare un SyncAdapter che estende AbstractThreadedSyncAdapter. La piano per mantenere automaticamente il mio codice all'intervallo richiesto:

     ContentResolver.setSyncAutomatically(account, AUTHORITY, true); ContentResolver.addPeriodicSync(account, AUTHORITY, settingsBundle, syncInterval); 

    Stavo cercando di creare un sistema di automazione in esecuzione in background. La mia gamma di frequenza era tra 1-15 minuti. Il mio desiderio non era quello di utilizzare un servizio in primo piano. Guardando il nome del metodo "setExactAndAllowWhileIdle", ho pensato che sia sicuro andare con allarmi un tempo, programmando il successivo quando finito.

    Tuttavia, non sono riuscito a trovare un modo per eseguire il codice in modalità double, con allarmi più frequenti di 15 minuti. Invece, scelgo di avviare un servizio di primo piano quando la modalità dozzina viene triggersta e arresta quel servizio di primo piano quando il telefono si risveglia. L'utente non vedrà la notifica della priorità alta mentre utilizza il suo telefono. Non mi import molto di quelli in modalità dozzina.

     PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if(intent.getAction().equals("android.os.action.DEVICE_IDLE_MODE_CHANGED")){ if (pm.isDeviceIdleMode()) { //startAutomationForegroundService(); } else { //stopAutomationForegroundService(); return; } AutomationReceiver.completeWakefulIntent(intent); return; } } 

    Devi registrare il filter di intenti "android.os.action.DEVICE_IDLE_MODE_CHANGED" nel tuo WakefulBroadcastReceiver. La cura che lo mette in manifestazione non può aiutare.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.