Android开发之Pending Intent

来源:互联网 发布:网络通缉犯在逃人员 编辑:程序博客网 时间:2024/05/23 16:38

一、Pending Intent简介

什么是PendingIntent?pending的英文意思是『即将发生的,待定的,未知的』。所有PendingIntent就是一种在将来某一时刻即将发生的intent。以此可以看出PendingIntent和Intent的区别在于前者是在未来某一时刻发生的意图,后者是立即发生的意图。PendingIntent类提供了一种创建可由其他应用程序在稍晚的时间触发的Intent的机制。PendingIntent通常用于包装在响应将来的事件时触发的Intent,例如单击Widget或Notification。PendingIntent典型的使用场景是在RemoteViews添加点击事件。因为RemoteViews运行在远程的进程中,所以RemoteViews的点击事件不同于其他普通的点击事件那样直接通过setOnClickListener方法来设置单击事件。要想给RemoteViews添加点击事件,就必须使用PendingIntent,PendingIntent通过send和cancel方法来发送和取消待定的Intent。

Tip:在使用时,PendingIntent会执行那些包装好的Intent,同时拥有与你在自己的应用程序中执行他们时候相同的权限和身份。

PendingIntent类提供构建PendingIntent的静态方法,以便启动Activity、启动Service或者广播Intent。


二、PendingIntent启动Activity、Service和广播一个Intent

<span style="font-size:14px;">int requestCode = 0;int flags = 0;//启动一个ActivityIntent startActivityIntent = new Intent(this,MyOtherActivity.class);PendingIntent.getActivity(this,requestCode,startActivityIntent,flags);//启动一个ServiceIntent startActivityIntent = new Intent(this,MyService.class);PendingIntent.getService(this,requestCode,startActivityIntent,flags);//发送广播Intent broadcastIntent = new Intent(NEW_LIFEFROM_DETECTED);PendingIntent.getBroadcast(this,requestCode,startActivityIntent,flags);</span>

PendingIntent 类包含了一些静态的常量,它们可以用于指定标志,以更新或者取消与指定动作匹配的现有Pending Intent,也可以用于指定该Intent是否只触发一次。


三、PendingIntent常用方法

PendingIntent的主要方法

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)



表中三个方法中参数意思是一样的,第一个和第三个参数的意思比较好理解,第一个context是上下文,第三个是intent意图。主要是第二个和第四个。第二个requestCode表示PendingIntent发送方的请求码,大多数情况下为0即可。另外requestCode会影响到flags的效果。第四个flags常见的类型有:FLAG_ONE_SHORT、FLAG_NO_CREATE、FLAG_CANCEL_CURRENT以及FLAG_UPDATE_CURRENT。

在阐述这四个标记位之前,先了解一下PendingIntent的匹配规则。PendingIntent的匹配规则:如果两个PendingIntent它们内部的Intent相同并且requestCode请求码也是一样的,那么这两个PendingIntent就可以认为是相同的。requestCode相同,只要值相同即可。什么情况下Intent会相同?Intent的匹配规则是,如果两个Intent的ComponentName(组件名)和Intent-filter相同,这个时候这两个Intent就是相同的。需要注意的地方是Extras不参与Intent的匹配过程,只要Intent之间的ComponentName和intent-filter相同,即使它们是Extras不同,也认为这两个intent也是相同的。

FLAG_ONE_SHORT:PendingIntent只能被使用一次,然后它就会被自动cancel掉。

如果后续还有相同的PendingIntent,那么它们的send方法就会调用失败。

对于通知栏消息来说,如果采用此标记位,那么同类的通知只能使用一次,

后续的通知单击后将无法打开。


FLAG_NO_CREATE:当前PendingIntent不会主动创建,如果当前PendingIntent之前不存在,

那么getActivity、getService、getBroadcast方法会直接返回null,即获取PendingIntent失败。

这个标记位很少用,它无法单独使用,因此在日常开发中很少使用。


FLAG_CANCEL_CURRENT:如果当前PendingIntent存在,那么它会被cancel掉,

然后系统会创建一个新的PendingIntent。对于通知栏来说,

那些被cancel掉的消息单击后将无法打开。


FLAG_UPDATE_CURRENT:如果当前PendingIntent已经存在,那么它会

被更新,即它们的Intent中的Extras会被替换成最新的。


如何去理解这四个标记位?

如:manager.notify(1,notification),如果notify的第一个参数id是常量,

那么多次调用notify只能弹出一个通知,后续的通知会把前面的通知

完全替代掉,而如果每次id不同每次调用就会弹出多个通知。


未完待续。。。。。。。。










0 0
原创粉丝点击