Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PendingIntent VS servie

PendingIntent VS servie

原创
作者头像
北洋
发布于 2023-12-16 02:12:05
发布于 2023-12-16 02:12:05
1620
举报
文章被收录于专栏:北洋csdn北洋csdn

pendingIntent 功能上来讲 是延迟执行的Intent,首先来看看延迟为什么需要延迟,某些场景下 我们并不能立马拿到交互结果需要等待一段时间才可以,比如通知点击,弹窗提醒,消息通知的最常用的就是pendingIntent。

如果是同一个进城的延迟执行很容易实现,可如果是跨进程的延迟执行intent可就有很多问题了,下面来讲讲有什么问题

问题背景:”跨进程执行客户端组件操作“

跨进程的操作,一般来说 我们会通过远程service来处理这个操作,然后客户端 服务端双方商定好协议就可以进行通信和交互;如果服务端 处理过程中 涉及到需要客户端执行客户端组件的操作(启动客户端组件)同样也是约定好协议 服务端发送请求让客户端执行对应的组件操作(其实也就是Intent)。

两个注意点:

  1. ”跨进程执行意图的操作“:如果是你自定义的业务协议Android帮不了,但是对于这种通用的跳转组件协议 android已经我们提取出来了:就是intent信息。比如Intent中传输Intent,服务端拿到intent后利用自己的context就可以 执行客户端指定的Intent操作(这种方式是有缺点的,后面讲解Intent嵌套方案缺点的时候详细说)
  2. 多进程:为什么单进程不需要呢,单进程本身就持有intent的引用,位于同一个进程内存地址空间中。

解决方案:Intent嵌套方案

大家其实会发现 上面说的服务端请求完全没有必要发送,只需要第一次在请求服务端的时候把需要客户端指定执行的组件操作(Intent)放到Intent的参数里面即可。

这里需要注意由于使用的是服务端的context启动的Intent而由于服务端没有客户端的组件所以会报错,因此需要客户端主动暴露(export)组件;

嵌套方案缺点

这里的缺点有两个方面,一个是针对客户端,一个是针对服务端:

  1. 客户端:由于使用的是服务端的context,所以需要让客户端的组件支持export,这种就比较受限制了,我们都知道暴露组件是非常危险的,方便服务端的同时也会给其他恶意应用增加攻击机会
  2. 服务端:由于使用的服务端的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的优点:

  1. 延迟执行:PendingIntent允许您延迟执行操作,直到满足特定的条件或时间点。这对于在稍后的时间执行操作或对用户行为进行响应非常有用。
  2. 简化代码:使用PendingIntent,您可以避免直接在Activity或Service中启动另一个Activity或Service,从而简化代码。通过PendingIntent,您可以将操作封装在一个Intent对象中,并将其添加到系统级别的队列中,等待合适的时机执行。
  3. 跨应用程序支持:PendingIntent提供了一种创建可由其它应用程序在稍晚时间触发的Intent的机制。这意味着您可以将PendingIntent发送给其他应用程序,以便在稍后时间执行相应的操作。
  4. 自定义操作:使用PendingIntent,您可以自定义操作的启动方式和行为,例如在指定的时间执行、在指定的界面上执行等。这为您提供了更大的灵活性,可以根据实际需求自定义操作。

总之,使用PendingIntent可以帮助您简化代码、实现跨应用程序支持、自定义操作行为等,提供更多的灵活性和便利性。但是,具体选择使用服务还是PendingIntent,还需要根据您的实际需求来决定。

我正在参与2023腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android 开发艺术探索笔记一
ViewRoot对应于ViewRootImpl类,它是连接windowmanager和DecorView的纽带,View的三大流程均是通过ViewRoot来完成的,在ActivityThread中,当activity创建完毕后,会将DecorView添加到window中,同时创建viewrootImpl对象,并将viewrootImpl与DecorView关联。View的绘制流程从viewRoot的performTraversals方法开始,经过三个过程将view绘制出来
Yif
2019/12/26
1K0
Android进程间通信
IPC方法总是产生客户/服务端模式的调用,也即是客户端组件(Activity/Service)持有服务端Service的组件,只能是客户端主动调用服务端的方法,服务端无法反过来调用客户端的方法,因为IPC的另一端Service无法获取客户端的对象。
六月的雨
2020/03/27
1.3K0
23 个重难点突破,带你吃透 Service 知识点「长达 1W+ 字」
Service 会运行 onCreate ,然后是调用 onBind , 这个时候调用者和 Service 绑定在一起。调用者退出了,Srevice 就会调用 onUnbind -> onDestroyed 方法。
圆号本昊
2021/09/24
1K0
23 个重难点突破,带你吃透 Service 知识点「长达 1W+ 字」
《移动互联网技术》第八章 消息与服务:掌握不同类型广播监听方式,以及创建通知的方法
《移动互联网技术》课程是软件工程、电子信息等专业的专业课,主要介绍移动互联网系统及应用开发技术。课程内容主要包括移动互联网概述、无线网络技术、无线定位技术、Android应用开发和移动应用项目实践等五个部分。移动互联网概述主要介绍移动互联网的概况和发展,以及移动计算的特点。无线网络技术部分主要介绍移动通信网络(包括2G/3G/4G/5G技术)、无线传感器网络、Ad hoc网络、各种移动通信协议,以及移动IP技术。无线定位技术部分主要介绍无线定位的基本原理、定位方法、定位业务、数据采集等相关技术。Android应用开发部分主要介绍移动应用的开发环境、应用开发框架和各种功能组件以及常用的开发工具。移动应用项目实践部分主要介绍移动应用开发过程、移动应用客户端开发、以及应用开发实例。 课程的教学培养目标如下: 1.培养学生综合运用多门课程知识以解决工程领域问题的能力,能够理解各种移动通信方法,完成移动定位算法的设计。 2.培养学生移动应用编程能力,能够编写Andorid应用的主要功能模块,并掌握移动应用的开发流程。 3. 培养工程实践能力和创新能力。  通过本课程的学习应达到以下目的: 1.掌握移动互联网的基本概念和原理; 2.掌握移动应用系统的设计原则; 3.掌握Android应用软件的基本编程方法; 4.能正确使用常用的移动应用开发工具和测试工具。
猫头虎
2024/04/08
3370
【漫画技术】Android跨进程通信
Tips:4个环节,共计约9小时的精心打磨完成上线,同时也非常感谢参与审稿的同学。
用户2802329
2018/08/07
3090
【漫画技术】Android跨进程通信
android 加入AIDL进行底层通讯,Android接口定义语言aidl通信简单理解, 简单客户端和服务端demo,ipc,Serializable和Parcelable区别
​AIDL:Android Interface Definition Language,即Android接口定义语言。
zhangjiqun
2024/12/16
2800
Android入门教程 | 四大组件之Service(前台服务,后台服务)
Service是一种可在后台执行长时间运行操作而不提供界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。
Android_anzi
2021/10/20
6.3K0
Android中进程间通信(IPC)方式,知多少?
小编在车机项目测试中,有很多的定制需求,需要系统或者第三方应用和车机应用进行通信,故针对此部分学习下,希望不再做测试小白。
用户5521279
2019/06/02
6.4K0
你说一下 PendingIntent 和 Intent 的区别?
PendingIntent 的应用场景关键在于间接的 Intent 跳转需求, 即先通过一级 Intent 跳转到某个组件,在该组件完成任务后再间接地跳转到二级的 Intent。PendingIntent 中的单词 “pending” 指延迟或挂起,就是指它是延迟的或挂起的。例如,你在以下场景中就可以使用 PendingIntent:
用户9995743
2022/09/26
7750
你说一下 PendingIntent 和 Intent 的区别?
Android跨进程通信IPC之14——其他IPC方式
前面几篇文章,我们介绍了IPC的基础知识和Binder机制,本篇文章主要讲解各种跨进程的通信方式。
隔壁老李头
2018/08/30
1.8K0
Android跨进程通信IPC之14——其他IPC方式
很全面的Android面试题
这些有些来源于网站、有些来源于自己的思考。可能有些问题网上有、可能有些问题对应的答案也有,有可能有些问题讲的不对,能指正的希望大家不吝指教。 Activity 什么是Activity 四大组件之一,一个和用户交的互界面就是一个activity,是所有 View 的容器 Activity 生命周期 生命周期描述的是一个类 从创建(new出来)到死亡(垃圾回收)的过程中会执行的方法. 在这个过程中会针对不同的生命阶段会调用不同的方法 Activity从创建到销毁有多种状态,从一种状态到另一种状态时会激发相应的回
六月的雨
2018/05/14
6K0
跨进程访问(AIDL服务)
我们都知道Service的主要的作用是后台运行和跨进程访问。 关于Service后台运行请查看鄙人的另外一篇文章Service基础
小小工匠
2021/08/16
9050
Android中的IPC方式
四大组件中的三大组件(Activity、Service、Receiver)都是支持在Intent中传递Bundle数据的,由于Bundle实现了Parcelable接口,所以它可以方便地在不同的进程间传输。
见得乐
2022/07/20
1.4K0
Android中的IPC方式
Android四大组件完全解析(二)---Service
Service两大功能 : 当应用程序不与用户交互时,运行一些需要长时间运行的操作 为其他应用提供一些功能(提供能够跨进程调用的功能) Service的配置: service需要在所在应用的androidmanifest文件中进行配置: <!-- name是service的包名路径--> <!-- permission定义了开启该service时所需要的权限--> <service android:name="com.android.server.backup.KeyValueBackupJob"
fanfan
2018/01/24
1.4K0
有关Android插件化思考
最近几年移动开发业界兴起了「 插件化技术 」的旋风,各个大厂都推出了自己的插件化框架,各种开源框架都评价自身功能优越性,令人目不暇接。随着公司业务快速发展,项目增多,开发资源却有限,如何能在有限资源内满足需求和项目的增长,同时又能快速响应问题和迭代新需求,这就是一个矛盾点。此时,插件化技术正好风生水起,去了解各个主流框架实现思路,看看能对目前工作是否有帮助,是很有必要的。
用户1269200
2018/10/08
1.3K0
有关Android插件化思考
图解 | Binder浅析(一)
Framework和Binder的内容挺深的,本文还是站在应用层开发者的角度来建立基本认知,能在遇到问题的时候有思路和方向即可。(本文将带着关键问题和核心流程展开,不会面面俱到)
Holiday
2020/11/06
1K0
Android跨进程通信IPC之11——AIDL
设计这门语言的目的是为了实现进程间通信,尤其是在涉及多进程并发情况的下的进程间通信IPC。每一个进程都有自己的Dalvik VM实例,都有自己的一块独立的内存,都在自己的内存上存储自己的数据,执行着自己的操作,都在自己的那个空间里操作。每个进程都是独立的,你不知我,我不知你。就像两座小岛之间的桥梁。通过这个桥梁,两个小岛可以进行交流,进行信息的交互。
隔壁老李头
2018/08/30
1.6K0
Android跨进程通信IPC之11——AIDL
Android:远程服务Service(含AIDL & IPC讲解)
步骤2. 在新建AIDL文件里定义Service需要与Activity进行通信的内容(方法),并进行编译(Make Project)
Carson.Ho
2019/02/22
2.6K0
Android查缺补漏(IPC篇)-- Bundle、文件共享、ContentProvider、Messenger四种进程间通讯介绍
本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8387752.html 在Android中进程间通信的实现方式有多种,包括:Bundle、文件共享、ContentProvider、Messenger、AIDL、Socket等等,其各有各的优缺点,接下来就分别介绍一下上述各种进程间的通信方式及实现。 一、Bundle Activity、Service、Receiver都支持Intent中传递Bundle数据,由于Bundle实现了Parc
codingblock
2018/03/30
1.3K0
现代 WorkManager API 已发布
随着设备性能提升和软件生态发展,越来越多的 Android 应用需要执行相对更复杂的网络、异步和离线等任务。例如用户想要离线观看某个视频,又不想一直停留在应用界面等待下载完成,那么就需要以一定的方式让这些离线的过程在后台运行。再比如您想将一段精彩的 Vlog 分享到社交媒体,肯定也会希望视频上传时不会影响到自己继续使用设备。这就涉及到了我们今天分享的主题: 使用 WorkManager 管理后台和前台工作。
Android 开发者
2022/03/28
1.4K0
现代 WorkManager API 已发布
相关推荐
Android 开发艺术探索笔记一
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档