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