Android组件化开发

组件化案例demo https://github.com/yangchong211/LifeHelper

目录

  1. 为什么组件化
  2. 什么是组件化
  3. 组件化架构
  4. 组件化配置
  5. 组件间通信方案

1. 为什么组件化
传统项目由于单一分层,以包划分业务功能,使代码高度耦合,
随着项目功能增加给多人开发增加维护难度。

2. 什么是组件化
将系统复杂功能拆分,重组的过程。在Android工程表现为把app按照其业务不同,划分为不同的Module

多module划分业务 和 基础功能 是 组件化的基础

组件:指单一的功能组件,比如视频组件,支付组件
模块:独立的业务模块,比如直播模块,首页模块
组件化好处

  • 各个组件专注自身功能实现,模块中代码高度耦合,只负责一项任务,也就是第一责任原则
  • 各业务研发互不干扰
  • 单个业务可以单独编译打包,加快编译速度,提高开发测试效率

3. 组件化架构

Android组件化开发_第1张图片
组件化架构

  • 基础层包含一个基础库和对基础库的封装,包括图片加载,网络请求,数据存储等
  • 业务组件层包含单一的业务,如登录、直播
  • 应用层用于统筹全部组件,并输出app


    Android组件化开发_第2张图片
    组件化架构

    Android组件化开发_第3张图片

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
目前路由是最佳方案
路由框架流程

image.png

告诉路由地址,路由从路由表寻址,找到则启动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相当于路由表

Android组件化开发_第4张图片
ARouter加载过程

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")

待补充...

你可能感兴趣的:(Android组件化开发)