Android La modalità API2 + Doze interferisce con AlarmManager


Esempio

Android 6 (API23) ha introdotto la modalità Doze che interferisce con AlarmManager. Usa determinate finestre di manutenzione per gestire gli allarmi, quindi anche se hai usato setExactAndAllowWhileIdle() non puoi fare in modo che il tuo allarme si setExactAndAllowWhileIdle() nel momento desiderato.

È possibile disattivare questo comportamento per l'app utilizzando le impostazioni del telefono ( Settings/General/Battery & power saving/Battery usage/Ignore optimizations o simili)

All'interno della tua app puoi controllare questa impostazione ...

String packageName = getPackageName();
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
if (pm.isIgnoringBatteryOptimizations(packageName)) {
   // your app is ignoring Doze battery optimization
}

... e alla fine mostra la rispettiva finestra di dialogo delle impostazioni:

Intent intent = new Intent();
String packageName = getPackageName();
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + packageName));
startActivity(intent);