定时器AlarmManager

前言

定时器AlarmManager常常用于需要周期性处理的场合,比如闹钟提醒、任务轮询等等。并且定时器来源于系统服务,即使App已经不在运行了,也能收到定时器发出的广播而被唤醒。

AlarmManager是Android提供的一个全局定时器,其使用范围要大于Timer方式。因为Timer方式采用Thread通信,所以只适用于线程间通信,并且生命周期也有限。如果在Activity中定义Timer,那么Activity页面销毁后,定时器也失效了;如果在Application中定义Timer,那么APP退出后,定时器也要失效。相比之下,AlarmManager利用系统的提醒服务定时发送广播,所以不但适用于线程间通信,而且也适用于进程间通信。另外,由于是系统服务发送广播,因此只要再次打开APP,就会自动收到广播发来的定时任务。

Android手机越用越慢的毛病老大不掉,为此每次系统版本升级,Android都力图在稳定性、安全性上有所改善。针对定时器AlarmManager的滥用问题,Android从4.4开始,修改了setRepeating方法的运行规则。原本该方法可指定每隔固定时间就发送定时广播,但在Android4.4之后,操作系统为了节能省电,将会自动调整定时器唤醒的时间。比如原来调用setRepeating方法设定了每隔10秒发送广播,但App在实际运行过程中,很可能过了好几分钟才发送一次广播,这意味着该方法将不再保证每次工作都在开发者设置的时间开始。

AlarmManager常用的启动方法有两个:

set : 该方法用于设置一次性定时器。第一个参数表示定时器类型,第二个参数表示任务执行时间,第三个参数表示定时任务。

手机在休眠期间,之前通过定时器的set方法设定好的定时任务,即使定时的时刻到达,也要等到苏醒期间才会得到执行。


setRepeating : 该方法用于设置重复定时器。第一个参数表示定时器类型,第二个参数表示任务首次执行时间,第三个参数表示再次执行的间隔时间,第四个参数表示定时任务。

setAndAllowWhileIdle与setExactAndAllowWhileIdle:

这两个方法是Android从6.0开始新增的定时方法,字面意思是即使正在休眠、也要执行定时任务。

如果一定要在休眠期唤醒闹钟,就得调用setAndAllowWhileIdle代替set方法,或者调用setExactAndAllowWhileIdle代替setExact方法。

定时器类型主要取值有:

RTC_WAKEUP : 表示定时器即使在睡眠状态下也会启用,此时定时器使用系统时间、

RTC : 表示定时器在睡眠状态下不可用,此时定时器使用系统时间

ELAPSED_REALTIME_WAKEUP : 表示定时器即使在睡眠状态下也会启用,此时定时器使用相对时间(相对于系统启动开始)

ELAPSED_REALTIME : 表示定时器在睡眠状态下不可用,此时定时器使用相对时间

因为AlarmManager使用的是系统服务来发送广播,所以在注册广播接收器时需要注意以下几点:
1、要在AndroidManifest.xml中定义receiver;
2、代码中注册接收器必须使用Context.registerReceiver,不能使用LocalBroadcastManager来注册;

PendingIntent

AlarmManager启动方法中的定时任务使用了PendingIntent类,PendingIntent顾名思义就是一个延迟处理的通信工具。PendingIntent的实例可通过下列三种方法得到:
getActivity : 获取用于启动页面的实例
getService : 获取用于启动服务的实例
getBroadcast : 获取用于发送广播的实例

三个方法的参数是一样的,第一个参数表示Context,第二个参数表示请求代码用于标识本次请求的唯一性,第三个参数表示Intent实例(可捆绑具体参数信息Bundle),第四个参数表示PendingIntent的启动标志,具体取值说明如下:

FLAG_ONE_SHOT : 此时启动的PendingIntent只能使用一次。
FLAG_NO_CREATE : 如果不存在描述的PendingIntent,则不会创建新任务。

FLAG_CANCEL_CURRENT : 如果已存在描述的PendingIntent,则先取消该任务再创建新任务。
FLAG_UPDATE_CURRENT : 一般用这个标志。如果已存在描述的PendingIntent,则更新而不是取消该任务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值