zoukankan      html  css  js  c++  java
  • AlarmManager与PendingIntent

    1.AlarmManager的作用与PendingIntent的关系

    顾名思义,就是“提醒”,是Android中常用的一种系统级别的提示服务,在特定的时刻为我们广播一个指定的Intent。简单的说就是我们设定一个时间,然后在该时间到来时,AlarmManager为我们广播一个我们设定的Intent,通常我们使用 PendingIntent,PendingIntent可以理解为Intent的封装包,简单的说就是在Intent上在加个指定的动作。在使用Intent的时候,我们还需要在执行startActivity、startService或sendBroadcast才能使Intent有用。而PendingIntent的话就是将这个动作包含在内了。

    (AlarmManager实际作用不仅仅作为闹钟,实际上它是一个全局的计时器,可以在指定时间或指定周期内执行某个组件)

    问:不是可以使用Handler的sendMessageDelayed()或者postDelayed()来定时吗?

    当当前应用被关闭的时候,进程就会停止,则Handler的消息也会消亡。但AlarmManger是系统服务,不会消亡。所以是最好定时的方法

    2.PendingIntent的作用及使用

    Intent与PendingIntent的区别:

    Intent 是及时启动,intent 随所在的activity 消失而消失。
    Pendingintent,一般用在 Notification上,可以理解为延迟执行的intent,PendingIntent是对Intent一个包装

    如何创建PendingIntnet:

    利用PendingIntent.getService()的方法
    public static PendingIntent getService (Context context, int requestCode, Intent intent, int flags)
    getService()包含了Context.startService(Intent)方法

    四个参数的意义:

    Context context:不用说了
    int requestCode:区分PendingIntent的请求代码
    Intent intent:意图
    int flags :一组用来决定如何创建PendingIntent的标识符

    flags参数:

    FLAG_UPDATE_CURRENT: 最经常使用的是FLAG_UPDATE_CURRENT,如果PendingIntent已经存在,保留它并且只替换它的extra数据。

    FLAG_CANCEL_CURRENT:如果PendingIntent已经存在,那么当前的PendingIntent会取消掉,然后产生一个新的PendingIntent。你可用使用它去检索新的Intent,如果你只是想改变Intent中的额外数据的话。通过取消先前的Intent,可用确保只有最新的实体可用启动它。如果这一保证不是问题,考虑flag_update_current。

    FLAG_NO_CREATE:利用FLAG_NO_CREAT获取的PendingIntent,若描述的Intent不存在则返回NULL值.

    LAG_ONE_SHOT:利用 FLAG_ONE_SHOT获取的PendingIntent只能使用一次,即使再次利用上面三个方法重新获取,再使用PendingIntent也将失败。

    上面4个flag中最经常使用的是FLAG_UPDATE_CURRENT,因为描述的Intent有 更新的时候需要用到这个flag去更新你的描述,否则组件在下次事件发生或时间到达的时候extras永远是第一次Intent的extras。
    使用 FLAG_CANCEL_CURRENT也能做到更新extras,只不过是先把前面的extras清除,另外FLAG_CANCEL_CURRENT和 FLAG_UPDATE_CURRENT的区别在于能否新new一个Intent,FLAG_UPDATE_CURRENT能够新new一个 Intent,而FLAG_CANCEL_CURRENT则不能,只能使用第一次的Intent。

    取消PendingIntent:

    pend.cancel();

    3.AlarmManager的使用 (http://blog.csdn.net/wangxingwu_314/article/details/8060312)

    步骤一:创建一个定时器

    //获取AlarmManager:
    AlarmManager am = (AlarmManager)context.getSystem.Service(Context.ALARM_SERVICE);

    步骤二:启动定时器

    //启动定时器:
        am.setRepeating(AlarmManager.RTC,System.currentTimeMillis(),延迟时间,pending);

    步骤三:取消定时器

    //取消定时器:
        am.cancel(pendingIntent);
    //记得释放pendIntent:
    pendingIntent.cancel();

    总结:AlarmManager:简单的说就是设置定时器的开始时间和循环间隔时间,启动pending。
      

  • 相关阅读:
    mybatis SQL 根据in条件语句排序
    Redis面试总结
    数据库优化之分库分表
    jdk1.6 Synchronized 优化总结
    CounDownLatch、CyclicBarrier、Semaphore
    java锁总结
    Redis 与 MySQL 双写一致性如何保证
    dubbo总结
    一、全国大学生电子设计竞赛测控(无人机)方向___基础篇
    编解码KL变换详解和哥伦布k阶编解码
  • 原文地址:https://www.cnblogs.com/rookiechen/p/5272446.html
Copyright © 2011-2022 走看看