PendingIntent(待定意图)是Android提供的一种外部程序调起自身程序的能力,生命周期不与主程序相关。
PendingIntent如果未cancel(),即使App关闭,也会继续存在。
外部程序通过PendingIntent只能调起三种组件:Activity,Service,Broadcast
PendingIntent的使用场景有三个:
(1)使用AlarmManager设定闹钟
(2)在系统状态栏显示Notification
(3)在桌面显示Widget
PendingInent静态方法获取:
(1)用于发送广播的PendingIntent
PendingIntent.getBroadcast( Context context , int requestCode , Intent intent , int flags )
(2)用于启动Activity的PendingIntent
PendingIntent.getActivity( Context context , int requestCode , Intent intent , int flags )
PendingIntent.getActivity( Context context , int requestCode , Intent intent , int flags , Bundle options )
(3)用于启动服务
PendingIntent.getService( Context context , int requestCode , Intent intent , int flags )
当PendingIntent在日后被激发时,将依照第三个参数Intent意图,执行发送广播、启动Activity、启动Service
PendingIntent是系统对于待处理数据的一个引用,称之为 token ;当主程序被 killed 时,token还是会继续存在的,可以继续供其他进程使用;如果要取消PendingIntent,需要调用PendingIntent的cancel方法。
当两个PendingIntent的 requestCode请求码 和 Intent的action、data、category属性 相同,则两个PendingIntent为同一个。
PendingIntent的第四个参数(int flags):设置多个FLAG用|分隔
(1) int FLAG_CANCEL_CURRENT
如果新请求的PendingIntent发现已存在时,取消已存在的,用新的PendingIntent替换。
(2) int FLAG_NO_CREATE
如果新请求的PendingIntent发现已存在时,忽略新请求的,继续使用已存在的,日常开发中很少使用。
(3) int FLAG_ONE_SHOT
表示PendingIntent只能使用一次,如果已使用过,那么 getXXX(...) 将返回NULL。
(4) int FLAG_UPDATE_CURRENT 【常用】
如果新请求的PendingIntent发现已存在时,如果Intent有字段改变了,Extra,这更新已存在的PendingIntent。
(5) int FLAG_IMMUTABLE【常用】 和 FLAG_MUTABLE
在Android12后,为了安全,必须在FLAG_IMMUTABLE和FLAG_MUTABLE中设置一个。FLAG_IMMUTABLE【常用】表示PendingIntent不可变,他的内容不可修改,推荐使用;FLAG_MUTABLE表示PendingIntent可变,允许修改它的内容。
//例
Intent intent_content = new Intent( context , MainActivity2.class );
PendingIntent pendingIntent = PendingIntent.getActivity( context , 2333 , intent , PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT );