Android 模块通信简述

总所周知,Android提供了很多不同的信息的传递方式,比如在四大组件中本地广播、进程间的AIDL、匿名间的内存共享、Intent Bundle传递等等,那么在这么多传递方式,哪种类型是比较适合组件与组件直接的传递呢。

  • 本地广播,也就是LoacalBroadcastRecevier。更多是用在同一个应用内的不同系统规定的组件进行通信,好处在于:发送的广播只会在自己的APP内传播,不会泄漏给其他的APP,其他APP无法向自己的APP发送广播,不用被其他APP干扰。本地广播好比对讲通信,成本低,效率高,但有个缺点就是两者通信机制全部委托与系统负责,我们无法干预传输途中的任何步骤,不可控制,一般在组件化通信过程中采用比例不高。

  • 进程间的AIDL。这个粒度在于进程,而我们组件化通信过程往往是在线程中,况且AIDL通信也是属于系统级通信,底层以Binder机制,虽说Android提供模板供我们实现,但往往使用者不好理解,交互比较复杂,往往也不适用应用于组件化通信过程中。

  • 匿名的内存共享。比如用Sharedpreferences,在处于多线程场景下,往往会线程不安全,这种更多是存储一一些变化很少的信息,比如说组件里的配置信息等等。

  • Intent Bundle传递。包括显性和隐性传递,显性传递需要明确包名路径,组件与组件往往是需要互相依赖,这背离组件化中SOP(关注点分离原则),如果走隐性的话,不仅包名路径不能重复,需要定义一套规则,只有一个包名路径出错,排查起来也稍显麻烦,这个方式往往在组件间内部传递会比较合适,组件外与其他组件打交道则使用场景不多。

模块化主要的难点就是模块间没有直接引用,如何通信的问题(以下用module来代替模块,也就是Android开发中的nodule),了解到的有主要以下几种思想:

  • 建立一个公共的module,每个功能module需要暴露的接口放到公共的module,实现类在各个module里,在公共module里存在一个接口管理类,一般是一个map,在初始化的时候,每个module将自己的的接口和实现类放到map(接口注册),每个module需要其他module的功能时,通过接口拿到实现类进行功能调用(接口访问)。这就像一种“SDK”的方式,公共module为各功能module提供接口和数据结构,这种方式是最容易想到的,也是早期的很多项目使用的一种方式,接口化的方式优点是结构清晰直观,调用链易追踪,对IDE更友好(可在IDE中直接跳转),协议变化直接反映在编译上,维护接口也简单。但缺点是由于注册初始化,要严格按照调用的先后顺序注册,设计正确的生命周期,相互依赖的关系链也需要花时间设计,而这个过程是“危险”的,各种借口依赖也是易变的。
  • Event通知类型的,如使用EventBus或者RxBus等事件总线的方式,这种方式虽然可以完成相应的跨module,解耦,但是却是最不推荐的方式,每种次通信都要定义一种类型,繁琐,从本质上来讲也不适合,EventBus或者RxBus更应该偏向于通知的思想,一对多,而且返回值也不好处理。而module间通信更倾向于功能提供,一般是一对一的,有时同步返回值,所以Event事件总线方式应该是最不合适的。
  • 使用路由框架,常用的开源库有ARouter,ActivityRouter等,通过Url来实现页面间的跳转,降低页面间的耦合,同时ARouter也支持提供服务的功能,这种模式可能也是现在很多项目使用的一种方式,但是我觉得这种路由的框架可能更偏重于页面跳转的场景,大部分的项目只需要能实现module间的接口提供和简单的页面跳转就足够了,同时因为都是通过字符串来代表协议,和接口的形式比起来不是那么直观。
  • 反射方式:通过反射可以调用集成在同一个APP中的另一个模块中的类或者方法,属性。因为反射是写死的类路径和类名,如果另一个模块中的类名变更的话,会导致反射找不到相对应的类,从而无法实现页面的跳转。

使用AIDL:https://cloud.tencent.com/developer/article/1151076

基于AIDL IPC:https://www.ctolib.com/yifei8-ABridge.html

模块化实践总结:https://github.com/LiushuiXiaoxia/AndroidModular

美团的组件化处理框架:https://tech.meituan.com/2018/12/20/modular-event.html

干货整理博客:Android模块化/组件化通信框架 https://www.ctolib.com/heimashi-module-service-manager.html#articleHeader3

谷歌官网例子:

https://developer.android.com/topic/libraries/architecture/index.html

https://developer.android.com/jetpack/docs/guide#best-practices

发布了189 篇原创文章 · 获赞 81 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/cpcpcp123/article/details/103876295
今日推荐