AlarmManager 提供对系统闹钟服务(或称为定时器服务)的访问接口,使用它既可以指定单次执行的定时任务,也可以指定重复运行的任务。当闹钟指定触发时间到达时,实际上是系统发出为这个闹钟注册的广播,因此我们需要实现一个针对特定闹钟事件的广播接口器(PendingIntent)。
从API 19开始,AlarmManager的机制都是非准确传递,操作系统将会转换闹钟,来最小化唤醒和电池使用
void set(int type,long startTime,PendingIntent pi)
解析:
type : 备注1
startTime : 闹钟执行时间
pi : 响应事件
void setRepeating(int type,long startTime,long intervalTime,PendingIntent pi)
解析:
type : 备注1
startTime : 闹钟执行时间
intervalTime: 间隔事件(可使用内部定义值 见备注2)
pi : 响应事件
void setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent pi)
解析:
type : 备注1
startTime : 闹钟执行时间
intervalTime: 间隔事件(可使用内部定义值 见备注2)
pi : 响应事件
说明:
与第二个方法相似,不过其两个闹钟执行的间隔时间不是固定的而已。它相对而言更省电(power-efficient)一些,因为系统可能会将几个差不多的闹钟合并为一个来执行,减少设备的唤醒次数
void cancel(PendingIntent pi)
说明:
取消和PendingIntent配置的闹钟服务
个人观点:
个人任务取消的应该和PendingIntent 的requestCode 参数有关。
例如:PendingIntent.getBroadcast(Context context, int requestCode, Intent intent, @Flags int flags)
A: AlarmManager 根据 PendingIntent requestCode 来判断是否是同一个定时服务,所以当
requestCode相等的时候只有最后一个生效
1. 我们说的requestCode 是第二个参数
PendingIntent.getBroadcast(Context context, int requestCode, Intent intent, @Flags int flags)
2. 例如:
PendingIntent pi1 = PendingIntent.getBroadcast(this, 1, intent, 0);
AlarmManager.setRepeating(AlarmManager.RTC_WAKEUP, startTime, intervalTime, pi1);
PendingIntent pi2 = PendingIntent.getBroadcast(this, 2, intent, 0);
AlarmManager.setRepeating(AlarmManager.RTC_WAKEUP, startTime, intervalTime, pi2);
这个样子就可以设定2个了