路由的高阶使用


多进程使用 TheRouter

TheRouter支持多进程,单默认只会在主进程执行初始化逻辑。如果使用了多进程,可以先关闭TheRouter的自动初始化,然后手动在ApplicationonCreate()中执行初始化功能。

override fun attachBaseContext(base: Context) {
    super.attachBaseContext(base)
    theRouterUseAutoInit = false
}

override fun onCreate() {
    super.onCreate()
    TheRouter.init(this)
}

自定义Log输出

默认情况下,TheRouter会在debug模式下,将log打印到控制台,在release模式下不做任何输出。
如果你希望采集线上日志信息,可以自定义release场景下的日志输出方式:

override fun onCreate() {
    // 这一步建议放在Application.onCreate()之前,否则可能会在赋值之前就有部分日志已经执行了默认逻辑。
    TheRouter.logCat = {tag, msg ->  
        // 执行上报日志的逻辑
    }
    super.onCreate()
}

判断String,是否为路由path

// 判断是否为路由落地页path
TheRouter.isRouterPath(path) : Boolean  

// 判断是否为 Action
TheRouter.isRouterAction(path) : Boolean

导出路由历史记录

如果需要记录用户历史操作信息,用于排查错误时回放,可以直接使用历史记录导出功能:

// level共8个状态可选
val NONE // 不导出任何数据
val ACTIVITY //仅导出Activity的路由操作
val FRAGMENT //仅导出Fragment的路由操作
val PAGE  // 导出 Fragment + Activity的路由操作
val ACTION  // 导出 ActionManager 的操作记录
val SERVICE_PROVIDER // 导出 ServiceProvider的记录
val FLOW_TASK // 导出 FlowTaskExecutor 的历史记录
val ALL // 导出全部记录

// 8种状态可互相叠加,例如
val level = ACTIVITY + ACTION + FLOW_TASK

export(level).forEach {
    info.append(it).append('\n').append('\n')
}

导入导出 Intent 对象

有一些特殊的业务场景可能必须使用Intent对象作为参数,例如通知栏点击以后,系统只提供了Intent参数。TheRouter 也支持这样的使用场景:

导入 Intent:

TheRouter.build(intent).withXxxxx().navigation()

导出 Intent:

// 注:导出Intent时,需要url有对应的落地页,否则Intent不会附带withXXX()的参数信息
val intent = TheRouter.build(url).withXxxxx().createIntent()

插件化项目集成

TheRouter的路由表是完全动态化的,所以允许动态加载插件路由表。 现有市面上插件化框架较多,具体可参考使用的插件化方案,当插件被加载时分别调用如下代码

// 在异步线程执行
execute {
    // 初始化插件内的依赖注入
    TheRouterServiceProvideInjecter.trojan();
    // 初始化插件内的FlowTask
    TheRouterServiceProvideInjecter.addFlowTask(context, TheRouter.digraph);
    // 初始化插件内的路由表
    TheRouterServiceProvideInjecter.initDefaultRouteMap();
}

Flutter/RN/WEEX等混编项目集成

TheRouter的路由表是完全动态化的,所以允许动态加载跨平台项目的路由表。

可以直接将路由表配置到/assets/RouteMap.json文件中。
如果路由表的url是具备规律的,可简单使用正则表达式一次性加载

[
  {
    "path": "https://kymjs.com/flutter/\\S*",
    "className": "com.therouter.FlutterActivity",
    "action": "",
    "description": "",
    "params": {
      "key":"value"
    }
  },
  ......
]