1.发送
AlarmManager alarmService = (AlarmManager) context.getSystemService(ALARM_SERVICE);
Intent alarmIntent = new Intent(context, ScreenControlAlarmReceiver.class).setAction("intent_alarm_log");
PendingIntent broadcast = PendingIntent.getBroadcast(context, 0, alarmIntent, 0);//通过广播接收
alarmService.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + INTERVAL, broadcast);//INTERVAL毫秒后触发
set有三个参数:
第一个参数表示闹钟类型:AlarmManager.RTC_WAKEUP表示使用当前系统的绝对时间,那么第二个参数触发时间也是精确的绝对时间。其他在文章最后介绍。
第二个参数表示为触发时间:可以是当前时间添加你的延迟时间System.currentTimeMillis() + INTERVAL,表示INTERVAL毫秒时间后进行触发。
第三个参数表示为触发时间:可以是当前时间添加你的延迟时间System.currentTimeMillis() + INTERVAL,表示INTERVAL毫秒时间后进行触发。
2.注册ScreenControlAlarmReceiver接收触发:
public class ScreenControlAlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//你的逻辑处理
//如果需要实现间隔定时器功能,在重新执行1的发送步骤,实现间隔定时,间隔时间为INTERVAL
}
//xml注册
".ScreenControlAlarmReceiver">
"intent_alarm_log"/>
3.取消闹钟
只需要取消同一个PendingIntent 即可。
AlarmManager alarmService = (AlarmManager) context.getSystemService(ALARM_SERVICE);
Intent alarmIntent = new Intent(context, ScreenControlAlarmReceiver.class).setAction("intent_alarm_log");
PendingIntent broadcast = PendingIntent.getBroadcast(context, 0, alarmIntent, 0);
alarmService.cancel(broadcast);
有时候需要定时精确时刻,比如今天下午定时16:51:00触发执行操作:
Calendar instance = Calendar.getInstance();
instance.set(Calendar.HOUR_OF_DAY, 16);//小时
instance.set(Calendar.MINUTE, 51);//分钟
instance.set(Calendar.SECOND, 0);//秒
AlarmManager alarmService = (AlarmManager) context.getSystemService(ALARM_SERVICE);
Intent alarmIntent = new Intent(context, ScreenControlAlarmReceiver.class).setAction("intent_alarm_log");
PendingIntent broadcast = PendingIntent.getBroadcast(context, 0, alarmIntent, 0);//通过广播接收
alarmService.set(AlarmManager.RTC_WAKEUP, instance.getTimeInMillis() , broadcast);
第一个参数:
public class AlarmManager {
//在系统精确时间触发,会唤醒cpu
public static final int RTC_WAKEUP = 0;
//在系统精确时间触发,设备休眠不唤醒不触发
public static final int RTC = 1;
//系统从启动到现在的A毫秒时间(包括深度睡眠的时间)后触发,A应该就是第二个参数
public static final int ELAPSED_REALTIME_WAKEUP = 2;
//统从启动到现在的A毫秒时间(包括深度睡眠的时间)后触发,A应该就是第二个参数
//系统休眠时不会唤醒cpu,也就不会触发
public static final int ELAPSED_REALTIME = 3;
第二个参数:
如果第一个参数指定是在精确时间触发,那个第二个参数也需要指定的是精确时间。如果如果第一个参数指定是启动到现在的相对时间,那个第二个参数应该是这个相对时间
出现的坑记录:
1.sdk19及以后,会出现时间不准问题,可以使用setExact方法。
2.同一个action,提交注册后会覆盖上一个注册。