文章目录
- 一、路由框架概述
- 二、路由框架整体流程
- 三、博客资源
组件化系列博客 :
- 【Android 组件化】从模块化到组件化
- 【Android 组件化】使用 Gradle 实现组件化 ( Gradle 变量定义与使用 )
- 【Android 组件化】使用 Gradle 实现组件化 ( 组件模式与集成模式切换 )
- 【Android 组件化】使用 Gradle 实现组件化 ( 组件 / 集成模式下的 Library Module 开发 )
- 【Android 组件化】路由组件 ( 路由组件结构 )
- 【Android 组件化】路由组件 ( 注解处理器获取被注解的节点 )
- 【Android 组件化】路由组件 ( 注解处理器中使用 JavaPoet 生成代码 )
- 【Android 组件化】路由组件 ( 注解处理器参数选项设置 )
- 【Android 组件化】路由组件 ( 构造路由表中的路由信息 )
- 【Android 组件化】路由组件 ( 使用 JavaPoet 生成路由表类 )
- 【Android 组件化】路由组件 ( 组件间共享的服务 )
- 【Android 组件化】路由组件 ( 生成 Root 类记录模块中的路由表 )
- 【Android 组件化】路由组件 ( 运行时获取 注解处理器 生成的路由表 )
- 【Android 组件化】路由组件 ( 路由框架概述 )
一、路由框架概述
路由框架 仅限于在 集成模式 下使用 , 组件模式下 , 路由框架不起任何作用 ;
在组件模式时 , 由于没有直接引用其它模块的类 , 独立运行时 , 也可以单独编译运行 ;
完整的组件化项目 ,
有一个主应用 , 和若干 Library 依赖库 ,
主应用 需要 依赖这些 Library 依赖库 ;
Library 依赖库之间需要有通信功能 , 有以下几种解决方案 : ① AIDL , ② 广播 BroadcastReceiver , ③ EventBus ;
AIDL 需要编写注册 Service 服务 , 并将服务进行绑定 ;
BroadcastReceiver 广播接收者 , 需要编写并注册 , 还需要发送广播 ;
EventBus 每个方法都要定义 Bean , 维护成本很高 ;
使用 路由框架 , 只要在想要暴露出去的类上使用 @Route 注解 , 就将该类暴露出去了 ,
在另外一个模块中 , 可以直接通过路由地址 , 获取并使用 @Route 注解暴露出来的类 ;
二、路由框架整体流程
定义 编译时注解 :
代码语言:javascript复制package kim.hsl.router_annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.CLASS)
public @interface Route {
/**
* 路由路径, 标识一个路由节点
* 该字段没有默认值, 必须设置
* @return
*/
String path();
/**
* 路由分组, 默认为空, 选择性设置
* 路由节点可以按照分组进行加载
* @return
*/
String group() default "";
}
使用编译时注解 :
代码语言:javascript复制@Route(path = "/app/MainActivity")
public class MainActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
注解处理器 在编译时 , 自动生成如下 路由表 类 , 下面的类对应的是 app 路由分组对应的路由表 , 用于管理 路由表中的 路由节点 ;
代码语言:javascript复制package kim.hsl.router;
import java.lang.Override;
import java.lang.String;
import java.util.Map;
import kim.hsl.component.MainActivity;
import kim.hsl.route_core.template.IRouteGroup;
import kim.hsl.router_annotation.model.RouteBean;
public class Router_Group_app implements IRouteGroup {
@Override
public void loadInto(Map<String, RouteBean> atlas) {
atlas.put("app", new RouteBean(RouteBean.Type.ACTIVITY, MainActivity.class, "/app/MainActivity", "app"));
}
}
生成的路由表需要进行管理 , 一个 Module 模块生成一个总 Root 表 , 用于管理该 Module 模块的 路由分组 ;
代码语言:javascript复制package kim.hsl.router;
import java.lang.Class;
import java.lang.Override;
import java.lang.String;
import java.util.Map;
import kim.hsl.route_core.template.IRouteGroup;
import kim.hsl.route_core.template.IRouteRoot;
public class Router_Root_app implements IRouteRoot {
@Override
public void loadInto(Map<String, Class<? extends IRouteGroup>> routes) {
routes.put("app", Router_Group_app.class);
}
}
使用 路由框架 时 , 首先要初始化路由表信息 , 在 Application 中调用 Router 的 init 方法 , 通过调用 注解处理器 编译时 生成的 路由分组表 , Root 表 , 获取路由信息 ;
具体如何在 运行时 获取路由表 , 参考 【Android 组件化】路由组件 ( 运行时获取 注解处理器 生成的路由表 ) 博客 ;
给定 一个路由地址 , 先去查找 Root 表 , 根据 路由地址 " /app/MainActivity " 中的分组信息 " app " , 查找 " app " 对应的路由表 Router_Group_app.class ;
然后获取 路由表 Router_Group_app.class 中的 " /app/MainActivity " 地址对应的 路由节点信息 " new RouteBean(RouteBean.Type.ACTIVITY, MainActivity.class, “/app/MainActivity”, “app”) " , 该路由地址对应 MainActivity.class 路由节点 , 是 Activity 类型的节点 ;
三、博客资源
博客源码 :
- GitHub : https://github.com/han1202012/Component