Android AlarmManager学习

松成和
2023-12-01


一、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_WAKEUPYES可以与RTC相同
RTCYES不可以使用绝对时间
可以通过调用 System.currentTimeMillis()获得
ELAPSED_REALTIME_WAKEUPYES可以与ELAPSED_REALTIME相同
ELAPSED_REALTIMEYES不可以使用相对时间(是从系统启动后开始计时的,包括睡眠时间)
可以通过调用SystemClock.elapsedRealtime()获得
POWER_OFF_WAKEUPYES
可以
设备在关机状态下也可以唤醒系统,
是一种关机闹铃
与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
AlarmManager的使用 - 使用BroadcastRecevier的例子
ApiDemo中也有例子

六、参考资料


linux实现的设备名为”/dev/alarm”,AlarmManager与AlarmManagerServie之间是通过Binder来通信的,他们之间是多对一的关系。


2014-07-23 更新




 类似资料: