AlarmManager实现定时功能

实现定时间隔功能

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,提交注册后会覆盖上一个注册。

你可能感兴趣的:(android开发)