一、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



AlarmManager的使用 - 使用BroadcastRecevier的例子



Android AlarmManager实现不间断轮询服务 - 使用Service的例子



ApiDemo中也有例子