android 解决 AlarmManager 警报器计时不准,在手机灭屏后延迟的问题
3、setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent pi),同样是用于设置重复闹钟,但是它是不准确的,相对于**setRepeating()**方法,更加节能,因为系统会将差不多的闹钟进行合并,以避免不必要地唤醒设备。每间隔大约 intervalTime 毫秒发送一次 PendingIntent,在间隔时间上有点误差。setRepeating 和 setInexactRepeating 的主要区别在于精确程度,使用 setInexactRepeating 可以减少电池的消耗,因此优先考虑此方法,对于时间要求比较精准的再考虑使用 setRepeating。
参数?int type:AlarmManager 的四个唤醒类型,它可以使用以下四个常量:
1、AlarmManager.ELAPSED_REALTIME:使用相对时间,可以通过 SystemClock.elapsedRealtime()获取(从开机到现在的毫秒数,包括手机的睡眠时间),设
备休眠时并不会唤醒设备。
2、AlarmManager.ELAPSED_REALTIME_WAKEUP:与 ELAPSED_REALTIME 基本功能一样,只是会在设备休眠时唤醒设备。
3、AlarmManager.RTC:使用绝对时间,可以通过 System.currentTimeMillis()获取,设备休眠时并不会唤醒设备。
4、AlarmManager.RTC_WAKEUP:与 RTC 基本功能一样,只是会在设备休眠时唤醒设备。
相对时间:设备 boot 后到当前经历的时间,SystemClock.elapsedRealtime()获取到的是相对时间。
绝对时间:1970 年 1 月 1 日到当前经历的时间,System.currentTimeMillis()和 Calendar.getTimeInMillis()获取到的都是绝对时间。
如果是相对时间,那么计算 triggerAtMillis 就需要使用 SystemClock.elapsedRealtime();
如果是绝对时间,那么计算 triggerAtMillis 就需要使用 System.currentTimeMillis()或者 calendar.getTimeInMillis()。
参数?long startTime: 闹钟的第一次执行时间,以毫秒为单位
参数 long intervalTime:表示两次闹钟执行的间隔时间,以毫秒为单位。
参数 PendingIntent pi: 绑定了闹钟的执行动作,比如发送一个广播、给出提示等等。
全兼容的 AlarmManager 示例代码,完美解决 android6.0 以上灭屏后闹钟延迟问题:
/得到闹钟管理器/
AlarmManager alarmManager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
/定义一个闹钟动作(taskService 是一个自定义的服务)/
Intent intent = new Intent(context, taskService.class);
PendingIntent pi = PendingIntent.getService(context, 0, intent, 0);
//版本大于 Android 6.0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pi);
}
//版本大于 Android 4.4
else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//单次闹钟:
//alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pi);
//重复闹钟:alarmManager.setWindow(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 5 * 1000,pi);} else {
评论