一、组件化的由来和优点
今年移动端很火的一个话题就是组件化,那么组件化又是怎么火起来的呢,并且组件化又到底是什么呢?
今年移动开发大会上,冯森林的一篇《回归初心,从容器化到组件化》(具体什么名字记不清了,
)之后,这个技术思想就立刻火起来了,很多公司的项目都开始走这个方向。它之所以能火起来,肯定是因为他的优点让大家所推崇,那么我下面我就简单谈谈我觉得组件化的最大优点(仅仅代表个人观点,如有不同意者,欢迎指正)。
![大笑](http://static.blog.csdn.net/xheditor/xheditor_emot/default/laugh.gif)
首先,它算是替代插件化的一种不会hook系统的方式。
同时也是插件化出现的原因:可以加快编译速度(使用Android studio都会有感触,一旦项目大了,编译时间5~10算短的,像淘宝这样的项目估计半个小时也是有可能的,所以阿里手淘团队研发的freeline(今年的各种大会,阿里也在推这个框架),以及Android studio也推出了intant run模式加快编译速度),组件化通过将整个大的app通过业务功能分割成多个module,每个module单独编译运行调试。
然后组件化支持多团队开发,每个团队开发维护自己的业务功能模块,并且各组件之间完全解耦,开发进度互相不会影响。
最后,从架构设计的角度,实现了高内聚低耦合,各个组件模块之间不存在耦合,所以只需要关心自己的模块,维护成本降低。
二、如何构建组件化,也就是如何拆分项目
看到有很多人问,组件化到底怎么做?我觉得这个拆分的过程要看个人,但是要遵循基本的思想,那就是按业务进行拆分;而且这个拆分的颗粒度的大小,也要看个人。既然这么多人有疑问,那么我就谈一下,我个人对拆分的一下建议(仅仅代表个人观点,如有错误,欢迎指正)。
1、将公共辅助功能抽取出来,作为基础库,供各个模块使用。那么公共辅助包括哪些:比如网络库、图片库等,还有一些个自定义控件,还有一些辅助类等等。这里个人还有一个建议:我们在使用一些开源库的时候,都会进行一次封装,这里我个人的一个建议就是比如网络库,一定抽取一个抽象层,然后你的业务代码需要调用网络库的时候,引用的是你的抽象层;这样的好处:面向接口编程,不耦合实现,如果需要更换其他网络库,只需要实现原来的抽象层封装,然后在里氏替换原则的时候替换原来的封装库。
2、一定要按照业务进行拆分,至于拆分的颗粒度,可大可小。往小了说,一个登录注册模块就可以拆分成一个组件,往大了说,就自己体会吧。前期的话,推荐颗粒度大点拆分,后面可以在拆开的组件中继续拆分。看个人见解而定。
三、组件间的通信问题
这也是本文的重点。两个场景:1.组件A需要启动组件B中的Activity,但是组件A根本就获取不到组件B的类,无法启动;2.组件A需要调用组件B的业务方法,还是无法获取到组件B的类。
解决方法:针对1,可以使用路由的方式来启动。这种方式的好处不仅如此,还支持通过web启动,而且可以和ios维护同一个url,两端统一处理。
针对2,通过注解,然后在编译器获取对应的注解,生成代码,建立中间代理类来存储需要调用类的全类名,然后通过反射的方式调用对应的业务逻辑。(这种思想来源于网上某人的博客,本人不记得具体什么人了,因为是他们公司的代码,他没有开源,但是提供了思想,还是很感谢。)
这里推荐本人写的一个简单的组件间通信的框架,原理apt+动态代理的方式。
项目源码地址:Qiaoba框架github地址
四、Qiaoba框架的简介和使用
1.框架支持功能
1》支持跨组件通过路由启动页面(支持自定义路由的方式)
2》支持Builder模式设置跳转页面需要传递的参数,启动Activity的flag,设置requestCode以及启动页面回调的支持(onSucess,onError)
3》借鉴了Retrofit使用外观模式+动态代理的方式,使用这种外观模式实现解耦和java面向对象方式实现路由启动页面
下面的功能是目前业界没有实现过的,只有本框架才有。