API23 打盹模式會干擾 AlarmManager

Android 6(API23) 引入了干擾 AlarmManager 的 Doze 模式。它使用某些維護視窗來處理警報,因此即使你使用了 setExactAndAllowWhileIdle(),也無法確保警報在所需的時間點觸發。

你可以使用手機設定(Settings/General/Battery & power saving/Battery usage/Ignore optimizations 或類似設定)為你的應用關閉此功能

在你的應用內,你可以檢查此設定…

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

…並最終顯示相應的設定對話方塊:

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);