ARouter 源码解析

875 阅读1分钟

一、名词解释

Postcard:明信片,用于发起启动请求

path:指定一个请求的路径:如 /modulea/home

group:path 的分组,为 path 中的第一个节点:如 modulea

RouteMeta:存储基础路由数据(如 Activity 类对象等)

xxxService:接口,用于提供某种功能,继承了 IProvider 接口;如要使用,需自己实现接口

routes:path -> RouteMeta 的 map

providersIndex:path -> xxxService 的 map

Warehouse:仓库,用于存储 routes、providersIndex 等

二、基本流程

ARouter.getInstance().build(path).navigation();

build(path)
    构建一个 Postcard
navigation()
    通过 Postcard 的信息 startActivity

build(path)
    获取 PathReplaceService 处理 path
    通过 path 获取 group
    通过 path、group 创建 Postcard

navigation()
    LogisticsCenter.completion(postcard)
        通过 path 在仓库 routes 中获取 RouteMeta,完善 Postcard
    _navigation()
        使用 Postcard 的信息,startActivity

LogisticsCenter.completion(postcard)
    通过 path 在仓库 routes 中获取 RouteMeta
    如果没有,通过 group 在仓库 groupsIndex 中获取 groupMeta,再将 groupMeta 中的所有 path 信息注入 routes,再次从 routes 中寻找
    如果有,通过  routes 中的 RouteMeta,完善 postcard(如 Activity 类、Extra 信息等)

三、仓库的填充

仓库的 routes 会在 LogisticsCenter.completion() 时填充内容 仓库的 groupsIndex、interceptorsIndex、providersIndex 会在 ARouter.init() 时填充内容

routes:

在这里插入图片描述

groupsIndex、interceptorsIndex、providersIndex:

在这里插入图片描述
在这里插入图片描述

四、服务的使用

RouteType 代表了 ARouter 可以跳转的类型:

在这里插入图片描述
其中的 Provider 类似于一个方法,用于提供一种服务。
在这里插入图片描述
PathReplaceService.class 用于处理 path,在 ARouter.getInstance().build(path) 时会调用 forString(path):

在这里插入图片描述
它需要我们自己实现:

@Route(path = "/modulea/pathReplace", name = "test PathReplaceService")
public class PathReplaceServiceImpl implements PathReplaceService {
    ...
}