关于PendingIntent

PendingIntent对Intent做了进一步的封装,然后把PendingIntent交给别的程序,定时或者由用户手动触发。这个主要用于Notification,AppWidget,AlarmManager等

首先看官方解释:An Intent is something that is used right now; a PendingIntent is something that may create an Intent in the future. You will use a PendingIntent with Notifications, AlarmManager, etc.


有三个静态方法可以获得PendingIntent实例:
public static PendingIntent getBroadcast(Context context, int requestCode, Intent intent, int flags)  
public static PendingIntent getActivity(Context context, int requestCode, Intent intent, int flags)  
public static PendingIntent getService(Context context, int requestCode, Intent intent, int flags) 


其中的参数,

requestCode,Private request code for the sender (currently not used).官方的解释是未用到,一般用0

flags,官方给了4个flag类型,也可以用0

FLAG_CANCEL_CURRENT:如果当前系统中已经存在一个相同的PendingIntent对象,那么就将先将已有的PendingIntent取消,然后重新生成一个PendingIntent对象。
FLAG_NO_CREATE:如果当前系统中不存在相同的PendingIntent对象,系统将不会创建该PendingIntent对象而是直接返回null。
FLAG_ONE_SHOT:该PendingIntent只作用一次,如果该PendingIntent对象已经触发过一次,那么下次再获取该PendingIntent并且再触发时,系统将会返回一个SendIntentException,在使用这个标志的时候一定要注意哦。
FLAG_UPDATE_CURRENT:如果系统中已存在该PendingIntent对象,那么系统将保留该PendingIntent对象,但是会使用新的Intent来更新之前PendingIntent中的Intent对象数据,例如更新Intent中的Extras。


一般比较常用的flag是FLAG_UPDATE_CURRENT和FLAG_CANCEL_CURRENT。


要注意的是,如果同时有多个PendingIntent,而且其中关联的Intent通过比较Intent.filterEquals是相同的,那么会覆盖前一个。一般的表现为Intent中的Extra中的不一致,例如:

Intent intent = new Intent(context, MainActivity.class);
intent.putExtra(“CMD”,”cmd1”);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,intent, 0);
remoteViews.setOnClickPendingIntent(R.id.widget_goto_main, pendingIntent);
如果另外一个是intent.putExtra("CMD", "cmd2"),那么悲剧就会出现,最后所有的响应都是cmd2。可以通过上述的flag来进行设置,或者改变Intent的action等条件。


PendingIntent的执行过程,调用send方法,具体见:http://www.devdiv.com/home.php?mod=space&uid=1&do=blog&id=2644


参考:http://developer.android.com/reference/android/app/PendingIntent.html

http://7dot9.com/2011/04/android-pendingintent%E7%9A%84%E4%B8%80%E4%BA%9B%E5%B0%8F%E8%BF%B7%E6%83%91/

你可能感兴趣的:(关于PendingIntent)