最近在学习Android组件化开发,自己写了一个demo,以此记录一点学习成果吧。我们在实际开发中,一个app一般都有很多个模块组成,一般的做法都是将这很多模块放入一个module中,随着我们的业务逻辑越来越复杂,开发调式并不是很方便,这时候我们就需要组件化,将每个模块都当作一个组件module,每个module都可以独立运行,这样既方便调式,也便于协同开发。下面我们就讲一下怎么来组件化。
首先来看一下项目的整体结构
在main app中需要持其他两个组件的依赖,直接添加会报错,因为组件也是可以单独运行的,所以要在gradle.properties文件中进行配置
接下来在main组件的gradle文件中进行配置,当作为组件时直接引入,作为项目时就不依赖
接下来在两个组件的gradle文件中进行配置,这里需要配置logincomponent为library还是application,编译版本compileSdkVersion,applicationId是否配置,以及minSdkVersion和targetSdkVersion,这是为了统一整个项目的编译和运行环境,这里还需要添加对commonlibs的依赖,这一步一定不能忘记哦。
配置完组件的gradle文件之后还需要配置一下AndroidManifest文件,logincomponent作为单独app运行时,这里需要单独建一个文件夹放入manifest文件
当logincomponent作为组件时manifest需要如下配置
minecomponent的配置和logincomponent是一样的。至此,我们的组件基本环境已经配置完毕,接下来就是组件和main app怎么通信,直接从main app中跳转到组件?当然这样也是可以的,但是这样的话main app和组件的耦合度就太高了,所以我们就需要找一个中介commonlibs,用它来负责main app和组件的通信。作为一个完整的app来说,我们的入口只有一个,因此我们application也只能有一个,所以我们需要将所有组件的application管理起来。
这里主要将组件的app名称添加进来,接下来在每个组件的application中初始化application对象,我们定义一个接口,让所有组件的application来实现
在main app中进行初始化,这里通过反射来调用IAppcomponent的init方法将当期的application传入,这样就保证所有组件持有的application对象为main app
接下来我们就来实现mainapp和组件间的通信,我们在libs中定义一个接口
主要有两个方法,一个是activity跳转的方法,一个是展示fragment的方法,那么谁来实现此接口呢?当然是我们的logincomponent
看到这里,大家是不是很熟悉这一段代码,就是我们activity跳转的标准代码,接下来我们需要一个serviceManager来管理这些页面跳转的service
然后需要在组件的app中需要进行初始化
接下来在我们的mainapp的activity实现跳转到logincomponent的入口activity
补充一下每个组件都需要添加对commonlibs的依赖,这样我们一个组件化的小demo就写完了。最后附上源码https://github.com/allenlzhang/CarltComponentDemo