组件化案例demo https://github.com/yangchong211/LifeHelper
目录
- 为什么组件化
- 什么是组件化
- 组件化架构
- 组件化配置
- 组件间通信方案
1. 为什么组件化
传统项目由于单一分层,以包划分业务功能,使代码高度耦合,
随着项目功能增加给多人开发增加维护难度。
2. 什么是组件化
将系统复杂功能拆分,重组的过程。在Android工程表现为把app按照其业务不同,划分为不同的Module
多module划分业务 和 基础功能 是 组件化的基础
组件:指单一的功能组件,比如视频组件,支付组件
模块:独立的业务模块,比如直播模块,首页模块
组件化好处
- 各个组件专注自身功能实现,模块中代码高度耦合,只负责一项任务,也就是第一责任原则
- 各业务研发互不干扰
- 单个业务可以单独编译打包,加快编译速度,提高开发测试效率
3. 组件化架构
- 基础层包含一个基础库和对基础库的封装,包括图片加载,网络请求,数据存储等
- 业务组件层包含单一的业务,如登录、直播
-
应用层用于统筹全部组件,并输出app
4. 组件化配置
在项目gradle.properties
添加
# 是否独立打包, true 以 app module运行
isRunAlone=false
然后每个module的build.gradle
增加以下代码
if(isRunAlone.toBoolean()){
apply plugin: 'com.android.application'
}else{
apply plugin: 'com.android.library'
}
5. 组件间通信方案
EventBus
RxBus
ARouter
目前路由是最佳方案
路由框架流程
告诉路由地址,路由从路由表寻址,找到则启动Activity
路由原理:
实现一系列url与特定Activity的映射关系
路由表(一般是Map容器),key是地址,value是Activity class,使用注解处理器 AbstractProcessor 获取指定注解信息,通过反射将Activity写入路由表。最后在跳转时,告诉跳转Activity的地址即可完成跳转。
5.1 组件间通过隐式跳转Activity
通过intent-filter来限定隐式Action
// 隐式跳转
Intent intent = new Intent("material.com.seetings");
startActivity(intent);
5.2 隐式跳转还可使用APP包名+类名
Intent intent = new Intent();
intent .setClassName("APP包名","Activity路径");
intent.setComponent(new ComponentName("App包名","Activity路径"));
startActivity(intent);
5.3 ARouter路由实现组件间Activity跳转
首先需要在基础组件Base Module添加
complie 'com.alibaba:arouter-api:1.1.0'
// 注解处理器
annotationProcessor 'com.alibaba:arouter-compiler:1.1.1'
注解处理器会使用javaCompileOptions这个配置获取当前module的名字
在各个模块中的build.gradle的defaultConfig属性加入
javaCompileOptions{
annotationProcessorOptions{
arguments = [ moduleName : project.getName()]
}
}
每个模块dependencies需要ARouter apt的引用,在apt中生成索引文件,完成跳转
dependencies{
annotationProcessor 'com.alibaba:arouter-compiler:1.1.1'
}
初始化Application
public class GankApplication extends Application{
public void onCreate(){
ARouter.init(this);
}
}
以Web模块为例,WebActivity需要添加注解Route,path是跳转的路径:
@Route(path = "/gank_web/1")
public class WebActivity extends Activity
使用ARouter跳转,build处填地址,withXXX填key-value,navigation就是发射了路由跳转。
ARouter.getInstance().build("/gank_web/1")
.withString("url",url)
,withString("title",desc)
.navigation();
WebActivity通过getIntent()就可以获取参数了。
Intent baseIntent = getIntent();
String url = baseIntent.getStringExtra("title");
String title = baseIntent.getStringExtra("title");
注意:ARouter依赖v4包,且版本必须是25.2.0以上
@Router(path = "group_name/1")的group_name
不能相同
6. ARouter原理
ARouter拥有自身的编译时注解框架,编译器会根据注解生成三个文件,分别是Group
,Providers
,Root
在Application加载时,ARouter会使用初始化调用init的方法,之后在LogisticsCenter中通过加载编译时注解创建Group
,Providers
,Root
三个类型文件,使用Warehouse将文件保存到三个不同的HashMap对象
Warehouse相当于路由表
7. 组件化方案
RxJava+Retrofit+DeepLinkDispatch
DeepLinkDispatch 借鉴 Retrofit 接口处理设计,OkDeepDispatch对跳转之后的回退会返回一个Observable对象,然后可以无缝接入RxJava
8. APT(注解处理器工具)
APT 是 javac 处理注解的工具,用来编译时扫描和处理注解
简单来说,就是编译期采集注解信息,生成.java文件。
使用步骤
8.1
public class Route extends AbstractProcessor{
}
8.2 注册,在类上加注解@AutoService(Processor.class)
8.3 指定要处理哪些注解 @SupportAnnotationTypes("com.enjoy.router.annotation.Route")
待补充...