关于PendingIntent

本文详细介绍了Android中PendingIntent的作用及实现方式,包括如何通过不同静态方法获取其实例,以及requestCode和flags参数的意义。文中还探讨了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 是 Android 中的一个重要概念,它是一个对 Intent 的描述,可将该描述交给其他程序,使其他程序在未来的某个时间执行安排好的操作。与普通 Intent 不同,普通 Intent 表示当前想要执行的操作,可在 Activity 中立即执行;而 PendingIntent 对 Intent 进行了包装,不一定马上执行,可传递给其他 Activity 或应用程序,获取到 PendingIntent 的应用程序能根据其中的 Intent 了解发出者的意图,并选择拦截、继续传递或执行 [^2]。 使用 PendingIntent 时,需使用其静态方法(如 `getActivity()`、`getService()`、`getBroadcast()`)创建对象,这些方法会返回一个 PendingIntent 对象,用于描述将来要执行的操作 [^1]。同时,创建 PendingIntent 时可设置不同的 Flags 类型,具体如下: - `FLAG_ONE_SHOT`:得到的 PendingIntent 只能使用一次,第二次使用时会报错。 - `FLAG_NO_CREATE`:当 PendingIntent 不存在时,不创建,返回 null。 - `FLAG_CANCEL_CURRENT`:每次都创建一个新的 PendingIntent。 - `FLAG_UPDATE_CURRENT`:不存在时就创建,创建好后一直使用,每次使用时都会更新 PendingIntent 的数据(使用较多) [^3]。 以下是 PendingIntent 在不同场景下的使用示例: #### 在 AlarmManager 中的使用 ```java import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; // ... Intent intent = new Intent("action", null, context, serviceClass); PendingIntent pi = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); manager.set(AlarmManager.RTC_WAKEUP, milis, pi); ``` #### 在 NotificationManager 中的使用 ```java import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; // ... Intent intent = new Intent(); intent.setAction("myaction"); PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); Notification n = new Notification(); n.icon = R.drawable.ic_launcher; n.when = System.currentTimeMillis(); n.setLatestEventInfo(this, "this is title", "this is a message", pi); nm.notify(0, n); ``` PendingIntent 的应用场景广泛,常见的有: - **定时任务**:结合 `AlarmManager` 实现定时提醒、定时执行服务等功能。 - **通知栏消息**:在通知栏消息中设置点击后的操作,如点击通知栏消息打开特定的 Activity 或执行广播等。 - **远程服务调用**:将 PendingIntent 传递给其他应用或系统服务,让其在合适的时机执行特定操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值