Android基础——PendingIntent理解
1. PendingIntent认识
PendIntent其实是Intent的封装,这就带来了⼏个问题:
为什么要有PendingIntent?与Intent有什么区别?
PendingIntent的应⽤场景主要有哪些?
它的内部是如何实现的?
packageinstaller
bdb1.1 与Intent的区别
Intent 是意图的意思。Android 中的 Intent 正是取⾃这个意思,它是⼀个消息对象,通过它,Android 系统的四⼤组件能够⽅便的通信,并且保证解耦。
sissy spacek
Intent 可以说明某种意图,携带⼀种⾏为和相应的数据,发送到⽬标组件。
PendingIntent是对Intent的封装,但它不是⽴刻执⾏某个⾏为,⽽是满⾜某些条件或触发某些事件后才执⾏指定的⾏为newly
A组件 创建了⼀个 PendingIntent 的对象然后传给 B组件,B 在执⾏这个 PendingIntent 的 nd 时候,它⾥⾯的 Intent 会被发送出去,⽽接受到这个 Intent 的 C 组件会认为是 A 发的。
B以A的权限和⾝份发送了这个Intent
我们的 Activity 如果设置了 exported = fal,其他应⽤如果使⽤ Intent 就访问不到这个 Activity,但是使⽤ PendingIntent 是可以的。
即:PendingIntent将某个动作的触发时机交给其他应⽤;让那个应⽤代表⾃⼰去执⾏那个动作(权限都给他)
老爸老妈浪漫史第九季
2.2 获取PendingIntent
how to make love关于PendingIntent的实例获取⼀般有以下五种⽅法,分别对应Activity、Broadcast、Service
getActivity()gap year
getActivities()
getBroadcast()
getService()
getForegroundService()
它们的参数都相同,都是四个:Context, requestCode, Intent, flags,分别对应上下⽂对象、请求码、请求意图⽤以指明启动类及数据传递、关键标志位。
前⾯三个参数共同标志⼀个⾏为的唯⼀性,⽽第四个参数flags:
vertical是什么意思FLAG_CANCEL_CURRENT:如果当前系统中已经存在⼀个相同的PendingIntent对象,那么就将先将已有的PendingIntent取消,然后重新⽣成⼀个PendingIntent对象。
level是什么意思FLAG_NO_CREATE:如果当前系统中不存在相同的PendingIntent对象,系统将不会创建该PendingIntent对象⽽是直接返回null,如果之前设置过,这次就能获取到。
FLAG_ONE_SHOT:该PendingIntent只作⽤⼀次。在该PendingIntent对象通过nd()⽅法触发过后,PendingIntent将⾃动调⽤cancel()进⾏销毁,那么如果你再调⽤nd()⽅法的话,系统将会返回⼀个SendIntentException。
FLAG_UPDATE_CURRENT:如果系统中有⼀个和你描述的PendingIntent对等的PendingInent,那
么系统将使⽤该PendingIntent对象,但是会使⽤新的Intent来更新之前PendingIntent中的Intent对象数据,例如更新Intent中的Extras
备注:两个PendingIntent对等是指它们的operation⼀样, 且其它们的Intent的action, data, categories, components和flags都⼀样。但是它们的Intent的Extra可以不⼀样
2.3 使⽤场景
flat什么意思关于PendingIntent的使⽤场景主要⽤于闹钟、通知、桌⾯部件。
⼤体的原理是: A应⽤希望让B应⽤帮忙触发⼀个⾏为,这是跨应⽤的通信,需要 Android 系统作为中间⼈,这⾥的中间⼈就是ActivityManager。 A应⽤创建建 PendingIntent,在创建 PendingIntent 的过程中,向 ActivityManager 注册了这个PendingIntent,所以,即使A应⽤死了,当它再次苏醒时,只要提供相同的参数,还是可以获取到之前那个 PendingIntent 的。当 A 将PendingIntent 调⽤系统 API ⽐如 AlarmManager.t(),实际是将权限给了B应⽤,这时候, B应⽤可以根据参数信息,来从ActivityManager 获取到 A 设置的 PendingIntent