zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

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

2023-09-27 14:28:11 时间

在这里插入图片描述

组件化系列博客 :





一、路由框架概述



路由框架 仅限于在 集成模式 下使用 , 组件模式下 , 路由框架不起任何作用 ;

在组件模式时 , 由于没有直接引用其它模块的类 , 独立运行时 , 也可以单独编译运行 ;


完整的组件化项目 ,

有一个主应用 , 和若干 Library 依赖库 ,

主应用 需要 依赖这些 Library 依赖库 ;


Library 依赖库之间需要有通信功能 , 有以下几种解决方案 : ① AIDL , ② 广播 BroadcastReceiver , ③ EventBus ;

AIDL 需要编写注册 Service 服务 , 并将服务进行绑定 ;
BroadcastReceiver 广播接收者 , 需要编写并注册 , 还需要发送广播 ;
EventBus 每个方法都要定义 Bean , 维护成本很高 ;


使用 路由框架 , 只要在想要暴露出去的类上使用 @Route 注解 , 就将该类暴露出去了 ,

在另外一个模块中 , 可以直接通过路由地址 , 获取并使用 @Route 注解暴露出来的类 ;





二、路由框架整体流程



定义 编译时注解 :

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 "";
}

使用编译时注解 :

@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 路由分组对应的路由表 , 用于管理 路由表中的 路由节点 ;

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 模块的 路由分组 ;

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 类型的节点 ;





三、博客资源



博客源码 :



在这里插入图片描述