在Android 6.0及以上版本中,当设备处于Doze模式下时,AndAllowWhileIdle闹钟会受到限制,如果wifi和移动数据被关闭,则该闹钟无法被调用执行。一种解决方法是在闹钟注册时添加setExactAndAllowWhileIdle()方法,该方法会在设备处于Doze模式下仍然保持闹钟的准时触发。示例代码如下:
AlarmManager alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(context, MyReceiver.class); PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { alarmMgr.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), alarmIntent); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { alarmMgr.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), alarmIntent); } else { alarmMgr.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), alarmIntent); }
这里,calendar是设置闹钟时间的Calendar对象,MyReceiver是AlarmManager触发时要启动的BroadcastReceiver。在调用setExactAndAllowWhileIdle()方法时,如果设备处于Doze模式下,该方法将保留闹钟的准时触发。如果设备不再Doze模式下,则会创建一个普通的AndAllowWhileIdle闹钟。为了向后兼容,如果设备版本低于Android 6.0,则使用setExact()或set()方法。
下一篇:按单词反转排序