023.PendingIntent 概述

   PendingIntent表示一种待定、等待、即将发生的意图,就是说接下来有一个Intent 将在某个条件下在某个时刻发生。因此PendingIntent和Intent的区别在于,Intent是立即发生的,而PendingIntent则是可能会在某个特地的时刻发生的。PendingIntent典型的应用场景就是给RemoteViews添加点击事件,因为RemoteViews运行在远程进程当中,因此RemoteViews不同于普通的View,无法为View添加OnClickListener,因此我们需要使用PendingIntent,PendingIntent 通过send和cancel来发送和取消待定的Intent.
    PendingIntent 支持第三种带定的意图:启动Activity ,启动Service 和 发送广播,对应着它的三个接口方法。如下:
  • static PendingIntent.getActivity( Context context , int requestCode , Intent intent , int flags)
        获得一个PendingIntent,该特定意图发生的时候,相当于Context.startActivity( Intent )
  • static PendingIntent.getService( Context context , int requestCode, Intent intent , int flags)
        获得一个PendingIntent ,该特定意图发生的时候,相当于Context.startService( Intent )
  • static PendingIntent.getBroadcast( Context context , int requestCode , Intent intent , int flags)
        获得一个PendingIntent,该特定意图发生的时候,相当于Context.sendBroadcast( Intent )
    上面的第一个和第三个参数不解释,第二个参数是请求代码 。一般都是写0.第四个参数是flags,常见的类型有:FLAG_ONE_SHOT、FLAG_NO_CREATE、FLAG_CANCEL_CURRENT 和 FLAG_UPDATE_CURRENT 。
    在介绍这四个Flag之前,先了解一下PendingIntent的匹配规则,也就是在什么情况下两个PendingIntent是相同的。
    PendingIntent的匹配规则为:如果两个PendingIntent它们内部的Intent相同并且requestCode也相同,那么这两个PendingIntent就是相同的。那么,什么情况下Intent是相同的呢?Intent的匹配规则是:如果两个 Intent的ComponentName 和Intent-filter相同,那么两个Intent就是相同的。需要注意的是Extras 不参与Intent的匹配过程,只要Intent的ComponentName和Intent-filter相同,即使Extras不同,那么这两个Intent也是相同的。

     FLAG_ONE_SHOT 
    当前描述的PendingIntent只能被使用一次,然后它就会被自动cancel,如果后续还有相同的PendingIntent,那么它们的send方法就会调用失败。对于通知栏来说,如果采用此标记位,那么同类的通知只能使用一次,后续的通知单击以后就无法执行我们想要的行为。
    
     FLAG_NO_CREATE
    当前描述的PendingInent不会被主动创建,如果当前的PendingIntent之前不存在,那么那getActivity等方法会返回null ,也就是说会获取PendingIntent失败。这个标记位不能单独使用,它能使用的前提是,之前存在着相同的PendingInent(Intent 和requestCode).
    
     FLAG_CANCEL_CURRENT
    当前描述的PendingIntent如果已经存在,那么它们就会被cancel,然后系统会创建一个新的PendingIntent。对于通知栏消息来说,那些被cancel的消息单击后将无法打开。比如,通知栏有1条消息了,我这时候再发送一个requestCode和intent一样的PendingIntent设为FLAG_CANCEL_CURRENT 那么,之前那条就会被取消掉。
    
    FLAG_UPDATE_CURRENT
    当前描述的PendingIntent如果已经存在,那么它们就会被更新,也就是Intent中的Extras会被换成最新的内容。

猜你喜欢

转载自blog.csdn.net/savelove911/article/details/52459517
今日推荐