写点什么

android 解决 AlarmManager 警报器计时不准,在手机灭屏后延迟的问题

用户头像
Android架构
关注
发布于: 16 小时前

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()获取(从开机到现在的毫秒数,包括手机的睡眠时间),设


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


备休眠时并不会唤醒设备。


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 {

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
android解决AlarmManager警报器计时不准,在手机灭屏后延迟的问题