问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

初探AlarmManager:使用

发布网友 发布时间:2022-12-27 03:11

我来回答

1个回答

热心网友 时间:2023-07-03 17:27

AlarmManager是Android系统提供的一种执行定时任务的手段,一般适用于长时间或者需要唤醒cpu保证准时的定时任务,提供唤醒和非唤醒, 重复和一次性等模式。系统源码中的闹钟app就是基于它。设备关闭或是重启的时候会被清除。

PendingIntent的getXXX方法名根据targetClass的类型替换, targetClass是除了content provider的其他组件。

大致解释一下PendingIntent。它是对Intent的进一步封装,能够完成更多的操作。它通过一系列getXXX得到,其中有两个参数比较重要:requestCode和flag。

有时Notification或AlarmManager会设置多个PendingIntent,PendingIntent通过requestCode区分不同,当通过它同时设置多个操作时需要注意设置不同的requestCode,否则后设置的会把先设置的覆盖掉。

FLAG_CANCEL_CURRENT:如果当前系统中已经存在一个相同的PendingIntent对象,那么就将先将已有的PendingIntent取消,然后重新生成一个PendingIntent对象。

FLAG_NO_CREATE:如果当前系统中不存在相同的PendingIntent对象,系统将不会创建该PendingIntent对象而是直接返回null。

FLAG_ONE_SHOT:该PendingIntent只作用一次。在该PendingIntent对象通过send()方法触发过后,PendingIntent将自动调用cancel()进行销毁,那么如果你再调用send()方法的话,系统将会返回一个SendIntentException。

FLAG_UPDATE_CURRENT:如果系统中有一个和你描述的PendingIntent对等的PendingInent,那么系统将使用该PendingIntent对象,但是会使用新的Intent来更新之前PendingIntent中的Intent对象数据,例如更新Intent中的Extras。

先解释一下type参数

不同闹钟类型对应的任务首次时间的获取方法:若为ELAPSED_REALTIME_WAKEUP,那么当前时间就为 SystemClock.elapsedRealtime();若为RTC_WAKEUP,那么当前时间就为System.currentTimeMillis()。

1.set

第二个方法是第一个方法的变体,区别就是从触发pendingintent变成了触发listener回调,但和pendingintent一样,只能和一个alarm绑定。后面的handler决定了在哪个handler中执行回调,填null则在主线程回调。
2.setExact

3.setWindow

4.setAndAllowWhileIdle

5.setAlarmClock

set方法提供设置一次性的闹钟,但随着Android系统的完善,考虑到功耗等等因素,需要更加精细地控制闹钟。因此提供了一些其他情况下的set方法。看下官方文档的描述:

在Android api19之前,set方法是精准的,但在19之后,为了降低频繁唤醒cpu造成的电量浪费,系统会自动将几个alarm放在一起触发,set方法自然也就无法保证准确性。

因此Android又提供了setExact和setWindow来保证准确性。setExact保证精准触发,setWindow保证在设置的时间段内一定触发。
然而在Android api23开始,Android加入了低电耗模式和应用待机模式。其中低电耗模式明确指出在该模式下setExact和setWindow都会延迟执行。但Android也给出了解决办法:

正如文档所述,setAndAllowWhileIdle和setExactAndAllowWhileIdle可以在低电耗下触发,或者使用setAlarmClock。
setAlarmClock和setAndAllowWhileIdle基本一致,都可以在低电耗模式下唤醒,持有mTriggerTime和mShowIntent(pendingIntent)两个成员变量,是对闹钟事件的一个封装,getNextAlarmClock返回的就是一个AlarmClockInfo。

1.setRepeating

2.setInExactRepeating

这两个方法可以重复执行设定的pendingIntent。区别同上。

7.1系统PendingIntent包装的Intent不能直接设置Parcable对象,但可以放到bundle中。经查阅好像是6.0以上会出现,需要注意。

https://www.jianshu.com/p/767412bf2af4
https://cloud.tencent.com/developer/article/1035539
https://www.cnblogs.com/leipDao/p/8203684.html

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
八月中国最凉快的地方 八月份哪里最凉快,去哪旅游好?美丽的地方 乱字同韵字是什么意思 华硕笔记本电脑触摸板怎么开笔记本电脑触摸板怎么开启和关闭_百度知 ... 陕西职务侵占案立案准则 结婚后我的恋情维系了十年,怎么做到的? 玉米仁子饭产自哪里 中国期货交易所的交易品种有哪些? 历史要怎么读,有啥诀窍 高中历史诀窍 企业支付宝转账必须通过余额转出吗 微信转账超额怎么办 这个耐克鞋是真的吗?如何鉴别? 阿迪达斯的贝壳头鞋的条形码扫出来的信息,与我实际买的鞋子信息不一样,是假货吗? 门店里买的鞋在网上收不到任何信息是假的吗? 短信发的怎么添加 周公解梦梦见老房子 农村大门对联集锦大全? 2d转3d解码器用电脑可以吗 战网绑定手机号尝试次数过多 战网绑定手机号从哪买 战网绑定手机号换了登录不了怎么办 如何解除战网绑定手机号 最新最经典的2022春节祝福句子春节暖心祝福语有哪些 最具时代感的春节祝福语 最具勉励力的春节祝福语 理财,到底是啥啊? 理财到底是为了什么? 有效氯含量次氯酸钠成什么 年会祝酒词如何说 16个3.7V1200mAH的18650怎样串联? 台州海涂泥打深l水井多少一米 我的世界生存模式末影龙会攻击玩家吗? 我的世界寄生虫boss有哪些 华为手机微信视频没有声音怎么办? qq音乐qq号和怎么关联 在承德银行app上怎么看卡号 红石砬到承德市大石庙收费站免疫吗? 油条是酸性还是碱性食物,油条是酸性还是碱性 云南财经大学博士在哪个校区 云南财经大学安宁校区是北部吗 怎么看资产负债表跟利润表 腾趯霄尹粢竹的小说名叫啥 汽车ABS塑料耐温多少度? 手工纸怎么做飞机模型 想知道橄榄油会凝固吗? 橄榄油擦脸会变黑吗 什么笔可以画透口罩 怎么设置来电显示为空号? 如果要贴钢化膜,需要把VOV0X27的原装膜撕下来吗? 恩松酵素是植物发酵的吗,健康吗