美文网首页
Android中AlarmManager详解以及利用Pendi

Android中AlarmManager详解以及利用Pendi

作者: 会议室窗边 | 来源:发表于2017-11-21 17:41 被阅读0次

    AlarmManager是提供一种访问系统闹钟服务的方式,允许你去设置在将来的某个时间点去执行你的应用程序。当你的闹钟响起(时间到)时,在它上面注册的一个意图(Intent)将会被系统以广播发出,然后自动启动目标程序,如果它没有正在运行。注册的闹钟会被保留即使设备处于休眠中(如果闹钟在给定时间响起可以选择是否唤醒设备)。如果闹钟关闭或者重启,闹钟将被清除。

    比如说我想在在每天的八点钟给用户一个通知,这里都必须用到PendingIntent,PendingIntent可以理解为Intent的封装包,简单的说就是在Intent上在加个指定的动作:

    private static final int INTERVAL = 1000 * 60 * 60 * 24;// 24h

    AlarmManager alarmService = (AlarmManager) getSystemService(ALARM_SERVICE);

    Calendar instance = Calendar.getInstance();

    instance.set(Calendar.HOUR_OF_DAY, 8);

    instance.set(Calendar.MINUTE, 0);

    instance.set(Calendar.SECOND, 0);

    Intent alarmIntent = new Intent(this, AlarmclockReceive.class);

    PendingIntent broadcast = PendingIntent.getBroadcast(this, 0, alarmIntent, 0);

    alarmService.setRepeating(AlarmManager.RTC_WAKEUP, instance.getTimeInMillis(),INTERVAL , broadcast);

    PendingIntent的getBroadcast中的参数的含义:

    这个主要讲解第四个参数Flags:

    PendingIntent的Flags为0代表该PendingIntent不带数据

    Flags为FLAG_CANCEL_CURRENT :如果AlarmManager管理的PendingIntent已经存在,那么将会取消当前的PendingIntent,从而创建一个新的PendingIntent

    Flags为PendingIntent.FLAG_UPDATE_CURRENT,

    PendingIntentcontentIntent = PendingIntent.getBroadcast(context, num,intent,PendingIntent.FLAG_UPDATE_CURRENT);

    对于FLAG_UPDATE_CURRENT,如果上面的num为常量, 则所有对应的Intent里面的数据被更新为最新的, 就是全部为最后一次的。

    相反,如果num每次不一样,则里面的Intent的数据没被更新。

    所以要通过extra数据来区分intent,应采用PendingIntent.FLAG_UPDATE_CURRENT),且每次num不一样

    AlarmManager的常用方法有三个:

    (1)set(int type,long startTime,PendingIntent pi);

    该方法用于设置一次性闹钟,第一个参数表示闹钟类型,第二个参数表示闹钟执行时间,第三个参数表示闹钟响应动作。

    (2)setRepeating(int type,long startTime,long intervalTime,PendingIntent pi);

    该方法用于设置重复闹钟,第一个参数表示闹钟类型,第二个参数表示闹钟首次执行时间,第三个参数表示闹钟两次执行的间隔时间,第三个参数表示闹钟响应动作。

    (3)setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent pi);

    该方法也用于设置重复闹钟,与第二个方法相似,不过其两个闹钟执行的间隔时间不是固定的而已。

    这里主要讲解第一种方法:

    set(int type,long startTime,PendingIntent pi))方法里面有三个参数:

    type: 闹钟的类型,有五种:

    AlarmManager.ELAPSED_REALTIME表示闹钟在手机睡眠状态下不可用,该状态下闹钟使用相对时间(相对于系统启动开始);

    AlarmManager.ELAPSED_REALTIME_WAKEUP表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟也使用相对时间;

    AlarmManager.RTC表示闹钟在睡眠状态下不可用,该状态下闹钟使用绝对时间,即当前系统时间( 让定时任务的触发时间从1970年1月1日0点开始算起);

    AlarmManager.RTC_WAKEUP表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟使用绝对时间,状态值为0;

    AlarmManager.POWER_OFF_WAKEUP表示闹钟在手机关机状态下也能正常进行提示功能,所以是5个状态中用的最多的状态之一,该状态下闹钟也是用绝对时间;不过本状态好像受SDK版本影响,某些版本并不支持;

    intervalTime:闹钟的第一次执行时间,以毫秒为单位,它必须和type相对应,比如type是AlarmManager.ELAPSED_REALTIME_WAKEUP类型,代表是使用的是相对时间,所以intervalTime必须也得是相对时间:

    SystemClock.elapsedRealtime()。

    SystemClock.elapsedRealtime()方法可以获取到系统开机至今所经历时间的毫秒数,

    System.currentTimeMillis()方法可以获取到1970年1月1日0点至今所经历时间的毫秒数

    就讲解到这里下面是我的写的例子:

    private static final int INTERVAL = 1000 * 60 * 60 * 24;// 24h

    AlarmManager alarmService = (AlarmManager) getSystemService(ALARM_SERVICE);

    Calendar instance = Calendar.getInstance();

    instance.set(Calendar.HOUR_OF_DAY, 8);//小时

    instance.set(Calendar.MINUTE, 0);//分钟

    instance.set(Calendar.SECOND, 0);//秒

    //这里是八点钟提醒一次

    //这里也可以指定哪一年的那一天

    //c.set(Calendar.YEAR,2016);//年

    //c.set(Calendar.MONTH,3);//月

    //c.set(Calendar.DAY_OF_MONTH, 12);//天

    Intent alarmIntent = new Intent(this, AlarmclockReceive.class);

    PendingIntent broadcast = PendingIntent.getBroadcast(this, 0, alarmIntent, 0);

    alarmService.setRepeating(AlarmManager.RTC_WAKEUP, instance.getTimeInMillis(), INTERVAL,broadcast);//这里一定要注意,一定要相对时间对应相对时间,

    绝对时间对应绝对时间,要不然通知你是收不到的,我就是在这里试了好几次都不行,最后发现这里写错了

    取消闹钟:

    AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);

    Intent i = new Intent(this, AlarmclockReceive.class);

    PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);

    manager.cancel(pi);

    完。

    相关文章

      网友评论

          本文标题: Android中AlarmManager详解以及利用Pendi

          本文链接:https://www.haomeiwen.com/subject/qdiwvxtx.html