PendingIntent
官方:http://developer.android.com/reference/android/app/PendingIntent.html
相关博客:http://blog.youkuaiyun.com/harvic880925/article/details/42030955包含总结PendingIntent的其他文章,以及两个容易出错的地方提醒
类信息:public final class PendingIntent extends Object implementsParcelable
简介:PendingIntent是对一个Intent对象和目标动作的一个描述,它包含了一个Intent对象,但是这个Intent所代表的动作并不会马上得到执行,而是在之后某一时刻执行,比如通过PendingIntent发出一个通知,那么得在这个通知被点击时,这个Intent才会执行。同时,执行这个PendingIntent的应用并不一定是发出这个PendingIntent的应用A本身,如果是其他应用B来执行这个PendingIntent,那么这个其他应用B将会以应用A的名义来执行这个操作。
通过getActivity(Context context, int requestCode, Intent intent, intflags)系列方法可以从系统取得一个用于启动一个Activity的PendingIntent对象;
通过getService(Context context, int requestCode, Intent intent, intflags)方法可以从系统取得一个用于启动一个Service的PendingIntent对象;
通过getBroadcast(Context context, int requestCode, Intent intent, intflags)方法可以从系统取得一个用于向BroadcastReceiver的Intent广播的PendingIntent对象。
一个PendingIntent本身就是一个系统令牌的引用,它可以实现获取对象的的元数据。这表示即使拥有这个PendingIntent的进程关闭了,这个PendingIntent对于那些收到它的进程依然有效。如果创建这个PendingIntent的程序又重新运行并重新获取同一个类型的PendingIntent(相同的操作,action,数据,类型和组件以及相同的标志),那么获取的这个PendingIntent还是指向同一个系统令牌(当这个令牌仍然有效的时候),当然,这个程序可以用cancel()来移除这个PendingIntent。
因此,当我们期望获得不同的PendingIntent时,我们必须确保它们所包含的Intent是不同的,需要的注意的是,我们不可以通过设置Intent的extra数据的不同来区分Intent。判断两个Intent是否相同,可以通过Intent提供的filterEquals(Intent other)方法。
à Intent由以下几个部分组成:动作(action),数据(data),分类(Category),类型(Type),组件(Component),和扩展信息(Extra)。两个Intent相同时,那么出Extra信息可以不同外,其他信息都是相同的。
翻译:
嵌套类:
PendingIntent.CanceledException类:当这个PendingIntent对象已经被取消或者不可执行任务时发送任务,则会抛出这个异常;
PendingIntent.OnFinished接口:当发送的一个操作已经执行完成时将调用这个回调。
常量:
FLAG_CANCEL_CURRENT 这个标志表示当已经存在一个与当前所需生成的PendingIntent对象相同的对象时(filterEquals(Intentother)方法返回true),那么将会先取消之前的那个PendingIntent对象,再生成新的这个对象。 它可以实现Intent携带的Extra Data更新,并且只有与这个新对象绑定的实体才可以使用它。
FLAG_UPDATE_CURRENT 这个标识表示当已经存在一个与当前所需生成的PendingIntent对象相同的对象时(filterEquals(Intent other)方法返回true),它只会去更新Extra Data中的内容,而所有与这个PendingIntent对象绑定的实体都可以使用新的Extra Data数据。
FLAG_NO_CREATE 这个标志表示当描述的这个对象不存在时,就简单地返回null,而不去生成它。
FLAG_ONE_SHOT 这个标志表示这个PendingIntent对象只能使用一次。在第一次使用send()方法调用以后,之后的所有调用都会失败。
公共方法:
1、public void cancel()
取消当前的一个PendingIntent对象。只有生成PendingIntent对象的原应用可以取消它。
2、public booleanequals (Object otherObj)
比较两个PendingIntent对象是否相同,当这两个对象代表同一应用的相同操作时返回true。
3、public staticPendingIntent getActivity (Context context, int requestCode, Intent intent, intflags)
返回一个可用于启动一个Activity的PendingIntent对象。需要注意的是这个activity会在当前应用之外启动,因此这个PendingIntent对象的Intent必须使用启动标签:Intent.FLAG_ACTIVITY_NEW_TASK。
出于安全原因考虑,这里的Intent必须是通过Intent.setClass方法明确指定这个需要启动的Activity。
4、public staticPendingIntent getBroadcast (Context context, int requestCode, Intent intent,int flags)
返回一个可用于启动一个Braodcast的PendingIntent对象。
5、public staticPendingIntent getService (Context context, int requestCode, Intent intent, intflags)
返回一个可用于启动一个Service的PendingIntent对象。
6、public StringgetCreatorPackage () add inandroid4 .2
返回创建这个PendingIntent对象的包名,它是这个对象的一个标识。这个String对象由系统返回,因此应用无法作假。
7、public intgetCreatorUid () add inandroid4 .2
返回创建这个PendingIntent对象的应用uid,它是这个对象的一个标识。这个String对象由系统返回,因此应用无法作假。
8、public UserHandlegetCreatorUserHandle () add in android4 .2
返回创建这个PendingIntent对象的应用UserHandle,它是这个对象的一个标识。这个String对象由系统返回,因此应用无法作假。
9、public IntentSendergetIntentSender ()
返回包装这个PendingIntent对象的IntentSender对象。
10、public StringgetTargetPackage ()
返回创建这个PendingIntent对象的包名。这个方法已经在android 4.2中被getCreatorPackage方法取代。
11、public int hashCode()
返回这个PendingIntent对象的hash code。两个相同的对象的hash code应该是一样的。
需要自己去覆盖Object的这个hashCode方法。
12、public static PendingIntentreadPendingIntentOrNullFromParcel (Parcel in)
读取Parcel对象中的Messengener对象或者null。它是在方法writePendingIntentOrNullToParcel(PendingIntent, Parcel) 中指定的。
13、public void send(int code)
执行关联到这个PendingIntent的操作。
14、public void send(Context context, int code, Intent intent, PendingIntent.OnFinished onFinished,Handler handler, String requiredPermission) add in android 4.0
执行关联到这个PendingIntent的操作。
15、public void send ()
执行关联到这个PendingIntent的操作。
16、public void send(Context context, int code, Intent intent)
执行关联到这个PendingIntent的操作。
17、public void send(Context context, int code, Intent intent, PendingIntent.OnFinished onFinished,Handler handler)
执行关联到这个PendingIntent的操作。
18、public static voidwritePendingIntentOrNullToParcel (PendingIntent sender, Parcel out)
制定一个PendingIntent或者null对象到Parcel对象。
19、public voidwriteToParcel (Parcel out, int flags)
将这个对象写入到Parcel。