Android 模块通信简述

南笙酒味 提交于 2020-01-07 17:51:14

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

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

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

干货整理博客: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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!