| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> 实现Android跨进程组件通信能有多简单? -> 正文阅读 |
|
[移动开发]实现Android跨进程组件通信能有多简单? |
实现Android跨进程组件通信能有多简单?作为一个Android开发,都要会点组件化知识。组件化的主要的特点,是剥离依赖,但组件间不直接依赖后,通信问题要怎么解决呢。 通常我们用的一下这种类似Binder通信的C/S架构,由一个ServiceManager服务管理器作为一个桥梁提供服务注册和服务查询,业务上要进行通信就是以下三部曲:定义服务接口,发布服务,使用服务。 这套架构在单一进程间运行很简单且直观,我们需要做的就是把服务接口下沉到公共依赖,在组件A实例化服务接口的对象,然后通过ServiceManager进行服务发布,组件B通过ServiceManager获取并使用服务就好了。但要想跨进程,就有点麻烦了。 保持这套架构的场景下,我们可以去写AIDL,让ServiceManager支持管理Binder类型的服务就好了,ServiceManager的角色用一个Android的Service去实现,每个组件要发布、查询服务,直接通过bind这个ServiceManager就可以了。通信模型大致如下: 看来做跨进程通信支持,模型变化也并不大,还剩下的问题就仅仅是每个服务类型的实现了,通常来讲就是定义AIDL以及实现Binder服务类。市面上很多框架也确实做到了这点,比如爱奇艺开源的Andromeda就支持跨进程的服务发布。 但我们还是得自己写AIDL,远程服务的使用端用IInterface代理的远程服务对象,每次使用都要处理RemoteException也要处理。实际上写过AIDL的朋友们可能知道这体验并不好。我觉得麻烦的点主要在于:
如果涉及到接口的改动,又要编译两次,改AIDL文件,改Stub类实现文件,如果在第4步用了包装类,还得改包装类文件…… 所以,跨进程通信的问题点主要麻烦在于AIDL书写起来太麻烦了! 现在的期望是:通过现在流行的APT(注解处理工具)技术动态生成这些模板代码,让我们回到最初,还是只关注接口、实现就好了,让跨进程组件通信和普通组件通信一样简单、优雅。 那要怎么做呢,继续往下看! 如何简化AIDL实现?仔细看来,AIDL流程中真正的实现核心还在于接口定义(对应AIDL定义)和接口实现(Stub实现),与普通服务定义并无二致。唯一比进程间服务多的处理大概就是远程服务需要考虑的RemoteException的处理了。整体实现过程其实好多都是模板化的工作,真正的核心也就是普通的接口定义以及实现,只要我们能够自动生成那些模板类,把实际实现代理给接口的实现类就好了。基于这种情况,我们来考虑使用动态生成代码的方式来避免写这些模板代码。 哪些东西可以自动生成?
新的跨进程通信模型假设我们已经完成以上文件的自动生成,若定义一个
另外假设 流程大致描述为:
自此,服务使用组件就拿到了一个IMusic服务对象,可以进行跨进程通信了。 于是,我们完成了简化的进程间通信模型,解答了小节标题提出的问题。 我们可以:不用再写AIDL,不用再等两遍编译,不用再考虑每次调用跨进程方法需要处理烦人的RemoteException,不用再害怕修改一点接口而去改很多个文件了,甚至可以用上IDE的重构功能,轻松修改接口定义实现…… 具体实现,开始使用经过几周的努力,目前大概实现了一个可用的版本: github传送 具体怎么用呢,看下面: 一、先看看普通组件服务发布使用流程,如下:
二、重头戏来了,跨进程组件服务发布流程,如下:注意:每个进程在使用跨进程服务相关接口前,都需要先初始化远程服务,提供context,一般可在Appiliction的onCreate方法初始化:
具体发布流程:
以上,今4个简单的变动,便完成了跨进程服务的发布使用,增量变动只有一个,就是初始化远程服务,其余部分都和写本地服务基本一致! 三、跨进程组件服务发布支持Parcelable类型参数
四、也支持AIDL的修饰符,oneway、in、out、inout
五、回调也是支持的
以上,基本上让跨进程服务和进程间服务使用无太大差别了,需要做的仅仅是加几个注解。 六、开始之前当然,在使用之前我们需要做一些基本的项目配置,如下:
高级用法除以上基本能力外,SimpleService还提供以下特性。 开始之前,先定义几个概念:
1. 远程服务重新发布能力通过SimpleService获取远程服务时,我们实际拿到的是一个代理类型,即为远程服务代理,这个类型是根据@RemoteService注解处理的接口自动生成的。其实现了被注解的接口,且代理了远程服务Binder。因为返回给服务使用者的对象是代理对象,所以我们能做到更新具体执行的远程服务Binder指向。这个特性可用于远程服务的重新发布。如下:
这个特性除了在组件A想主动更新服务实现时,对于组件A所在进程异常退出后又重启发布服务的情况,也能进行断线重连。 甚至,如果你想对本地服务也实现这种服务更新,也可以将其通过远程服务的方式进行发布_。 2. 自定义远程服务调用时的异常处理由于我们返回给使用者的
3. 获取一个
|
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 10:29:49- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |