Alarm
作者:追风剑情 发布于:2016-8-4 14:40 分类:Android
Alarm是一种预先确定的时间或时间间隔内激活Intent的方式。和Timer不同,Alarm是在应用程序之外操作的,所以即使应用程序关闭,它们也仍然能够用来激活应用程序事件或操作。当它们和Broadcast Receiver一起使用时会更加强大,允许设置能够激活广播Intent、启动Service、甚至启动Activity的Alarm,而不需要打开或者运行应用程序。
Alarm是降低应用程序资源需求的一种极为有效的方式,它允许停止Service和清除定时器,同时仍然可以执行调度的操作。可以使用Alarm实现基于网络查找的定时更新,或者把费时的或者成本受约束的操作安排在“非高峰”时期运行,又或者对失败的操作调度重试。
对于那些只在应用程序的生命周期内发生的定时操作,将Handler类和Timer以及Thread组合起来使用是一种比使用Alarm更好的方法,因为这样做允许Android更好地控制系统资源。通过把调度事件移出应用程序的控制范围,Alarm提供了一种缩短应用程序生命周期的机制。
Android中的Alarm在设备处于休眠状态时依然保持活动状态,可以有选择地设置Alarm来唤醒设备;然而,无论何时重启设备,所有的Alarm都会被取消。Alarm操作是通过AlarmManager进行处理的,AlarmManager是一个通过getSystemService访问的系统Service
一次性Alarm
要创建一个新的只激活一次的Alarm,可以使用set方法并给它指定一个Alarm类型、触发时间和一个要激活的Pending Intent。如果把Alarm的触发时间设置为过去的时间,那么它将会被立即触发。
以下是4种可用的Alarm类型:
RTC_WAKEUP: 在指定的时间唤醒设备,并激活Pending Intent
RTC: 在指定的时间点激活Pending Intent,但是不会唤醒设备
ELAPSED_REALTIME: 根据设备启动之后经过的时间激活Pending Intent,但是不会唤醒设备。经过的时间包含设备休眠的所有时间。
ELAPSED_REALTIME_WAKEUP: 在设备启动并经过指定的时间之后唤醒设备和激活Pending Intent
你的选择将会决定传递给set方法的时间值是一个特定的时间,还是一个已经过去的等待时间。当触发Alarm时,就会广播指定的Pending Intent。因此,使用相同的Pending Intent设置第二个Alarm会代替已经存在的Alarm。要取消一个Alarm,需要调用Alarm Manager的cancel方法,并传递给它不再想触发的Pending Intent。
示例
//设备如果处于休眠状态,设置Alarm来唤醒设备 int alarmType = AlarmManager.ELAPSED_REALTIME_WAKEUP; //10秒后触发设备 long timeOrLengthOfWait = 10000; //创建能够广播和操作的Pending Intent String ALARM_ACTION = "ALARM_ACTION"; Intent intentToFire = new Intent(ALARM_ACTION); PendingIntent alarmIntent = PendingIntent.getBroadcast(this, 0, intentToFire, 0); //设置Alarm alarmManager.set(alarmType, timeOrLengthOfWait, alarmIntent); //要取消一个Alarm //alarmManager.cancel(alarmIntent);
重复Alarm
重复Alarm和一次性Alarm具有相同的工作方式,不过会在指定的时间间隔重复触发。因为Alarm是应用程序生命周期之外设置的,所以它们十分适合于调度定时更新或者数据查找,从而避免了在后台持续运行Service。要想设置重复Alarm,可以使用Alarm Manager的setRepeating或setInexactRepeating方法。两种方法都支持指定Alarm类型、第一次触发的时间和Alarm触发时激活的Pending Intent当需要对重复Alarm的精确时间间隔进行细粒度的控制时,可以使用setRepeating方法。传入这个方法的时间间隔值可以用于指定Alarm的确切时间间隔,最多可以精确到毫秒。当按照计划定时唤醒设备来执行更新时会消耗电池的电量,setInexactRepeating方法能够帮助减少这种电量消耗。在运行时Android会同步多个没有精确指定时间间隔的重复Alarm,并同时触发它们。
setInexactRepeating方法接受下面列出的一个Alarm Manager常量,所以不必为它指定精确的时间间隔:
INTERVAL_FIFTEEN_MINUTES
INTERVAL_HALF_HOUR
INTERVAL_HOUR
INTERVAL_HALF_DAY
INTERVAL_DAY
使用没有精确指定时间间隔的重复Alarm,可以避免每个应用程序在类似但不重叠的时间段内独立唤醒设备。
通过同步这些Alarm,系统可以限制定期重复事件对电池电量的影响。
示例
//获取一个Alarm Manager的引用。 AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE); //如果设备处于休眠状态,设置Alarm来唤醒设备。 int alarmType = AlarmManager.ELAPSED_REALTIME_WAKEUP; //调度Alarm以每半小时重复一次。 long timeOrLengthOfWait = AlarmManager.INTERVAL_HALF_HOUR; //创建能够广播和操作的Pending Intent String ALARM_ACTION = "ALARM_ACTION"; Intent intentToFire = new Intent(ALARM_ACTION); PendingIntent alarmIntent = PendingIntent.getBroadcast(this, 0, intentToFire, 0); //每半小时唤醒设备以激活一个Alarm alarmManager.setInexactRepeating(alarmType, timeOrLengthOfWait, timeOrLengthOfWait, alarmIntent); //取消Alarm //alarmManager.cancel(alarmIntent);
标签: Android
日历
最新文章
随机文章
热门文章
分类
存档
- 2024年9月(2)
- 2024年8月(3)
- 2024年7月(11)
- 2024年6月(3)
- 2024年5月(9)
- 2024年4月(10)
- 2024年3月(11)
- 2024年2月(24)
- 2024年1月(12)
- 2023年12月(3)
- 2023年11月(9)
- 2023年10月(7)
- 2023年9月(2)
- 2023年8月(7)
- 2023年7月(9)
- 2023年6月(6)
- 2023年5月(7)
- 2023年4月(11)
- 2023年3月(6)
- 2023年2月(11)
- 2023年1月(8)
- 2022年12月(2)
- 2022年11月(4)
- 2022年10月(10)
- 2022年9月(2)
- 2022年8月(13)
- 2022年7月(7)
- 2022年6月(11)
- 2022年5月(18)
- 2022年4月(29)
- 2022年3月(5)
- 2022年2月(6)
- 2022年1月(8)
- 2021年12月(5)
- 2021年11月(3)
- 2021年10月(4)
- 2021年9月(9)
- 2021年8月(14)
- 2021年7月(8)
- 2021年6月(5)
- 2021年5月(2)
- 2021年4月(3)
- 2021年3月(7)
- 2021年2月(2)
- 2021年1月(8)
- 2020年12月(7)
- 2020年11月(2)
- 2020年10月(6)
- 2020年9月(9)
- 2020年8月(10)
- 2020年7月(9)
- 2020年6月(18)
- 2020年5月(4)
- 2020年4月(25)
- 2020年3月(38)
- 2020年1月(21)
- 2019年12月(13)
- 2019年11月(29)
- 2019年10月(44)
- 2019年9月(17)
- 2019年8月(18)
- 2019年7月(25)
- 2019年6月(25)
- 2019年5月(17)
- 2019年4月(10)
- 2019年3月(36)
- 2019年2月(35)
- 2019年1月(28)
- 2018年12月(30)
- 2018年11月(22)
- 2018年10月(4)
- 2018年9月(7)
- 2018年8月(13)
- 2018年7月(13)
- 2018年6月(6)
- 2018年5月(5)
- 2018年4月(13)
- 2018年3月(5)
- 2018年2月(3)
- 2018年1月(8)
- 2017年12月(35)
- 2017年11月(17)
- 2017年10月(16)
- 2017年9月(17)
- 2017年8月(20)
- 2017年7月(34)
- 2017年6月(17)
- 2017年5月(15)
- 2017年4月(32)
- 2017年3月(8)
- 2017年2月(2)
- 2017年1月(5)
- 2016年12月(14)
- 2016年11月(26)
- 2016年10月(12)
- 2016年9月(25)
- 2016年8月(32)
- 2016年7月(14)
- 2016年6月(21)
- 2016年5月(17)
- 2016年4月(13)
- 2016年3月(8)
- 2016年2月(8)
- 2016年1月(18)
- 2015年12月(13)
- 2015年11月(15)
- 2015年10月(12)
- 2015年9月(18)
- 2015年8月(21)
- 2015年7月(35)
- 2015年6月(13)
- 2015年5月(9)
- 2015年4月(4)
- 2015年3月(5)
- 2015年2月(4)
- 2015年1月(13)
- 2014年12月(7)
- 2014年11月(5)
- 2014年10月(4)
- 2014年9月(8)
- 2014年8月(16)
- 2014年7月(26)
- 2014年6月(22)
- 2014年5月(28)
- 2014年4月(15)
友情链接
- Unity官网
- Unity圣典
- Unity在线手册
- Unity中文手册(圣典)
- Unity官方中文论坛
- Unity游戏蛮牛用户文档
- Unity下载存档
- Unity引擎源码下载
- Unity服务
- Unity Ads
- wiki.unity3d
- Visual Studio Code官网
- SenseAR开发文档
- MSDN
- C# 参考
- C# 编程指南
- .NET Framework类库
- .NET 文档
- .NET 开发
- WPF官方文档
- uLua
- xLua
- SharpZipLib
- Protobuf-net
- Protobuf.js
- OpenSSL
- OPEN CASCADE
- JSON
- MessagePack
- C在线工具
- 游戏蛮牛
- GreenVPN
- 聚合数据
- 热云
- 融云
- 腾讯云
- 腾讯开放平台
- 腾讯游戏服务
- 腾讯游戏开发者平台
- 腾讯课堂
- 微信开放平台
- 腾讯实时音视频
- 腾讯即时通信IM
- 微信公众平台技术文档
- 白鹭引擎官网
- 白鹭引擎开放平台
- 白鹭引擎开发文档
- FairyGUI编辑器
- PureMVC-TypeScript
- 讯飞开放平台
- 亲加通讯云
- Cygwin
- Mono开发者联盟
- Scut游戏服务器引擎
- KBEngine游戏服务器引擎
- Photon游戏服务器引擎
- 码云
- SharpSvn
- 腾讯bugly
- 4399原创平台
- 开源中国
- Firebase
- Firebase-Admob-Unity
- google-services-unity
- Firebase SDK for Unity
- Google-Firebase-SDK
- AppsFlyer SDK
- android-repository
- CQASO
- Facebook开发者平台
- gradle下载
- GradleBuildTool下载
- Android Developers
- Google中国开发者
- AndroidDevTools
- Android社区
- Android开发工具
- Google Play Games Services
- Google商店
- Google APIs for Android
- 金钱豹VPN
- TouchSense SDK
- MakeHuman
- Online RSA Key Converter
- Windows UWP应用
- Visual Studio For Unity
- Open CASCADE Technology
- 慕课网
- 阿里云服务器ECS
- 在线免费文字转语音系统
- AI Studio
- 网云穿
- 百度网盘开放平台
- 迅捷画图
- 菜鸟工具
- [CSDN] 程序员研修院
- 华为人脸识别
- 百度AR导航导览SDK
- 海康威视官网
- 海康开放平台
- 海康SDK下载
交流QQ群
-
Flash游戏设计: 86184192
Unity游戏设计: 171855449
游戏设计订阅号
![点击查看原图 gh_f0fe8e830402.jpg](http://www.devacg.com/gh_f0fe8e830402.jpg)