一、AlarmManager是什么
可以设置即使系统锁屏休眠之后依然可以存在。
Alarm Manager有个很好的特性就是即使在你的应用程序真正退出或手机休眠时,它仍然起作用。
Alarm Manager发出的消息通过拥有一个CPU唤醒锁,保证即使锁屏的情况下避免手机进入休眠状态,当在手机接收器的onReceive方法中处理完发送的消息后才会释放锁,手机才能进入休眠状态。
但是手机接收器的onReceive方法中调用Context.startService()方法,可能还没执行手机已经休眠,所以需要自己处理这种情况。可以产考PowerManager。
AlarmManager会在Intent中另外携带一个Intent.EXTRA_ALARM_COUNT,以表示对于该Intent已经有多少个Alarm被累计,这里的累计,是指在type为ELAPSED_REALTIME或RTC时,因为设备处于休眠无法激活Alarm,无法发送Intent,从而进行累计.普通情况下该值为1.
AlarmManager对象配合Intent使用,可以定时的开启一个Activity,发送一个BroadCast,或者开启一个Service.
二、使用场景
1. 在指定时长后执行某项操作
2.周期性的执行某项操作(闹钟、轮循机制)
三、类型
| 指定时间发送 | 当系统进入休眠是否可以唤醒系统 | 使用时间 |
RTC_WAKEUP | YES | 可以 | 与RTC相同 |
RTC | YES | 不可以 | 使用绝对时间 可以通过调用 System.currentTimeMillis()获得 |
ELAPSED_REALTIME_WAKEUP | YES | 可以 | 与ELAPSED_REALTIME相同 |
ELAPSED_REALTIME | YES | 不可以 | 使用相对时间(是从系统启动后开始计时的,包括睡眠时间) 可以通过调用SystemClock.elapsedRealtime()获得 |
POWER_OFF_WAKEUP | YES |
可以
设备在关机状态下也可以唤醒系统,
是一种关机闹铃
| 与RTC相同 |
关于省电
四、支持方法
方法AlarmManager提供的方法:
void setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)
设置一个重复类型的闹钟
如果之前已经存在会先cancel掉之前的,然后再次启动
void set(int type, long triggerAtTime, PendingIntent operation)
设置一个新的闹铃
void setInexactRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)
设置一个重复闹钟的不精确版本,它相对而言更节能(power-efficient)一些,因为系统可能会将几个差不多的闹钟合并为一个来执行,减少设备的唤醒次数。
内置的几个interval为:
INTERVAL_FIFTEEN_MINUTES
INTERVAL_HALF_HOUR
INTERVAL_HOUR
INTERVAL_HALF_DAY
INTERVAL_DAY
如果你将其设为DAY,那么可能这一天中的所有闹钟都会被合并掉。
void cancel(PendingIntent operation)
取消一个与参数匹配的闹铃
void setTimeZone(String timeZone)
设置系统的默认时区。需要android.permission.SET_TIME_ZONE权限
五、例子
可以支持Service、BroadcastRecevier、Activity
ApiDemo中也有例子
六、参考资料
linux实现的设备名为”/dev/alarm”,AlarmManager与AlarmManagerServie之间是通过Binder来通信的,他们之间是多对一的关系。
2014-07-23 更新