51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 3081|回复: 0
打印 上一主题 下一主题

关于AlarmManager你必须知道的事!

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-4-8 15:23:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.常量

AlarmManager主要是使用到了5个关于时间类型的常量
ELAPSED_REALTIME:表示闹钟在手机睡眠状态下不可用,该状态下闹钟使用相对时间(相对于系统启动开始),状态值为3,使用SystemClock.elapsedRealtime()可获得时间
ELAPSED_REALTIME_WAKEUP:表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟也使用相对时间,状态值为2,SystemClock.elapsedRealtime();
RTC:表示闹钟在睡眠状态下不可用,该状态下闹钟使用绝对时间( SystemClock.currentThreadTimeMillis()),即当前系统时间,状态值为1;
RTC_WAKEUP:表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟使用绝对时间(SystemClock.currentThreadTimeMillis()),状态值为0;
AlarmManager.POWER_OFF_WAKEUP表示闹钟在手机关机状态下也能正常进行提示功能,所以是5个状态中用的最多的状态之一,该状态下闹钟也是用绝对时间,状态值为4;不过本状态好像受SDK版本影响,某些版本并不支持;

2.常用的方法

①set(int type, long triggerAtMillis, PendingIntent operation)
该方法用于设置一次性闹钟,第一个参数表示闹钟类型,第二个参数表示闹钟执行时间,第三个参数表示闹钟响应动作。
②setExact(int type, long triggerAtMillis, PendingIntent operation)
设置一个闹钟在规定的时间内准确地发出。(当然准确是不可能准确的)
③ setWindow(int type, long windowStartMillis, long windowLengthMillis, PendingIntent operation)
大致的参数同前面几个,第三个参数指的是当警报发出时最大延迟时间是多少。
④setExactAndAllowWhileIdle(int type, long triggerAtMillis, PendingIntent operation)
同setExact,即使在系统低功耗的情况下也能发出警报,
⑤setAndAllowWhileIdle(int type, long triggerAtMillis, PendingIntent operation)
同set咯
⑥setAlarmClock(AlarmManager.AlarmClockInfo info, PendingIntent operation)
第一个参数表示闹钟的信息当然使用的是绝对时间,第二参数想要执行的意图

由于我的需求是需要app在熄屏以后也能继续运行所以很是尴尬在保活成功的前提下我使用了如下方法:
  1. //7.0以上的手机
  2. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
  3.   AlarmManager.AlarmClockInfo alarmClockInfo = newAlarmManager.AlarmClockInfo(targetTime, null);
  4.                 mAlarmManager.setAlarmClock(alarmClockInfo, pendingIntent);
  5.             } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//android 6.0以上7.0一下的手机
  6.                 mAlarmManager.setExact(AlarmManager.RTC_WAKEUP, targetTime, pendingIntent);
  7.             } else {
  8.                 mAlarmManager.set(AlarmManager.RTC_WAKEUP, targetTime, pendingIntent);
  9.             }
复制代码

亲测在小米手机上延迟小于60S 但是在华为7.0的手机上无效仍然存在问题 在华为8.0的手机上没有问题。

关于设置重复闹铃的问题情况:
setInexactRepeating (int type, long triggerAtMillis, long intervalMillis, PendingIntent operation)
设置一个不精确的重复的闹钟
setRepeating (int type, long triggerAtMillis, long intervalMillis, PendingIntent operation)
设置一个精确的重复的闹钟(当然仅仅在api19之前是精确)
在4.4以后的系统上谷歌官方推荐的方法是重复的使用一次性的闹铃来达到重复的作用。

仅供参考,如有错误,欢迎指正谢谢!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-4-26 11:40 , Processed in 0.060598 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表