【Android 组件化】路由组件 ( 路由框架概述 )

2023-03-29 13:01:18 浏览数 (2)

文章目录

  • 一、路由框架概述
  • 二、路由框架整体流程
  • 三、博客资源

组件化系列博客 :

  • 【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

0 人点赞