pendingIntent 功能上来讲 是延迟执行的Intent,首先来看看延迟为什么需要延迟,某些场景下 我们并不能立马拿到交互结果需要等待一段时间才可以,比如通知点击,弹窗提醒,消息通知的最常用的就是pendingIntent。
如果是同一个进城的延迟执行很容易实现,可如果是跨进程的延迟执行intent可就有很多问题了,下面来讲讲有什么问题
问题背景:”跨进程执行客户端组件操作“
跨进程的操作,一般来说 我们会通过远程service来处理这个操作,然后客户端 服务端双方商定好协议就可以进行通信和交互;如果服务端 处理过程中 涉及到需要客户端执行客户端组件的操作(启动客户端组件)同样也是约定好协议 服务端发送请求让客户端执行对应的组件操作(其实也就是Intent)。
两个注意点:
- ”跨进程执行意图的操作“:如果是你自定义的业务协议Android帮不了,但是对于这种通用的跳转组件协议 android已经我们提取出来了:就是intent信息。比如Intent中传输Intent,服务端拿到intent后利用自己的context就可以 执行客户端指定的Intent操作(这种方式是有缺点的,后面讲解Intent嵌套方案缺点的时候详细说)
- 多进程:为什么单进程不需要呢,单进程本身就持有intent的引用,位于同一个进程内存地址空间中。
解决方案:Intent嵌套方案
大家其实会发现 上面说的服务端请求完全没有必要发送,只需要第一次在请求服务端的时候把需要客户端指定执行的组件操作(Intent)放到Intent的参数里面即可。
这里需要注意由于使用的是服务端的context启动的Intent而由于服务端没有客户端的组件所以会报错,因此需要客户端主动暴露(export)组件;
嵌套方案缺点
这里的缺点有两个方面,一个是针对客户端,一个是针对服务端:
- 客户端:由于使用的是服务端的context,所以需要让客户端的组件支持export,这种就比较受限制了,我们都知道暴露组件是非常危险的,方便服务端的同时也会给其他恶意应用增加攻击机会
- 服务端:由于使用的服务端的Context启动的Intent,因此这个Intent可以调起服务端的所有组件,这个同样是非常危险的,如果黑客发过来一个恶意的intent,那么服务端的所有组件都可以拿到,
其次由于使用的是Service进程的Context,所以携带过来的intent是可以调起服务端的组件.
官方有解释这种情况,下面的文章:
https://juejin.cn/post/6953077703671021575
为什么会出现pendingIntent
从问题入手分析解决方案,背景是我们需要跨进程执行客户端的组件(跨进程执行Intent),问题是需要暴露客户端组件而且服务端的context也会被滥用。
如果我们能够让执行Intent的context是客户端呢?这样客户端不需要暴露组件,服务端也不会用自己的context调用intent自然不可以拿到服务端的组件信息。
上面一大段话 就是为了引出这个核心(也是pendingIntent最大的作用):身份切换。
方案有了,其次这种场景还特别常见,比如点击通知,推送信息,客户端/服务端自定义需求,那么这些信息就需要一个可信的,安全的地方统一保存,答案就是系统来帮忙做。
首先系统需要知道哪些Intent需要切换,其次是知道怎样进行切换。官方提出了PendingIntent来帮助我们实现。
哪些Intent需要进行切换,其实就是需要把“跨进程调用客户端组件”的意图信息保存到系统中,在服务端使用的时候自动帮我们切换为客户端的身份去执行这个intent。
PendingIntent VS servie总结
这个是PendingIntent相对于Service的优点:
- 延迟执行:PendingIntent允许您延迟执行操作,直到满足特定的条件或时间点。这对于在稍后的时间执行操作或对用户行为进行响应非常有用。
- 简化代码:使用PendingIntent,您可以避免直接在Activity或Service中启动另一个Activity或Service,从而简化代码。通过PendingIntent,您可以将操作封装在一个Intent对象中,并将其添加到系统级别的队列中,等待合适的时机执行。
- 跨应用程序支持:PendingIntent提供了一种创建可由其它应用程序在稍晚时间触发的Intent的机制。这意味着您可以将PendingIntent发送给其他应用程序,以便在稍后时间执行相应的操作。
- 自定义操作:使用PendingIntent,您可以自定义操作的启动方式和行为,例如在指定的时间执行、在指定的界面上执行等。这为您提供了更大的灵活性,可以根据实际需求自定义操作。
总之,使用PendingIntent可以帮助您简化代码、实现跨应用程序支持、自定义操作行为等,提供更多的灵活性和便利性。但是,具体选择使用服务还是PendingIntent,还需要根据您的实际需求来决定。
我正在参与2023腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!