TheRouter 简介

  TheRouter是货拉拉开源的路由结构,针对Android渠道完成组件化、跨模块调用、动态化等功用的集成结构。
TheRouter :/post/713971…
Github: github.com/HuolalaTech…
官网:therouter.cn/

为什么要用TheRouter

功用 TheRouter ARouter WMRouter
Fragment路由 ✔️ ✔️ ✔️
支撑依靠注入 ✔️ ✔️ ✔️
加载路由表 无运行时扫描无反射 运行时扫描dex反射实例类功用损耗大 运行时读文件反射实例类功用损耗中
注解正则表达式 ✔️ ✖️ ✔️
Activity指定拦截器 ✔️(四大拦截器可根据业务定制) ✖️ ✔️
导出路由文档 ✔️(路由文档支撑增加注释描绘) ✔️ ✖️
动态注册路由信息 ✔️ ✔️ ✖️
APT支撑增量编译 ✔️ ✔️(敞开文档生成则无法增量编译) ✖️
plugin支撑增量编译 ✔️ ✖️ ✖️
多 Path 对应同一页面(低成本完成双端path一致) ✔️ ✖️ ✖️
远端路由表下发 ✔️ ✖️ ✖️
支撑单模块独立初始化 ✔️ ✖️ ✖️
支撑运用路由翻开第三方库页面 ✔️ ✖️ ✖️

上图是从官方获取的介绍,结合自己运用,从以下几点介绍他的好处

  • 运用简易
  • 针对后台startActivity的兼容处理
  • 直接获取Intent目标
  • 动态下发路由表的骚操作
  • 和Arouter功用比较

– 运用简易

  针对刚下手的同学,很多同学其实需求的功用不多,首要便是跳转页面,原先运用过的Arouter,也能快速习惯。想深化学习更多的同学能够再去官网或者官方see see

// 简略的传参和路由跳转
TheRouter.build("test://webview/home")
    .withString("url", "http://www.baidu.com")
    .navigation(act)
    // 如果要翻开的是fragment,需求运用 .createFragment();

– 针对后台startActivity的兼容处理

Android 10 (级别 29) 及更高版别对后台应用可发动 Activity 的时间施加约束。这些约束有助于最大限度地减少对用户造成的中止(能够更省电),并且能够让用户更好地操控其屏幕上显示的内容。

  官方针对Android10以及以上版别调用startActivity的约束,也便是在后台调用该方法是无法跳转的,TheRoute供给兼容处理,先暂停跳转,等APP从头发动了再持续跳转。

// 以下代码只是功用介绍,咱们按需自取
// 后台跳转页面
fun goBackActivity(activity: Activity) {
    val navigator: Navigator =
        TheRouter.build("test://webview/home")
            .withString("paramStr", paramStr)
            .withInt("paramInt", 0)
    if (AndroidVersion.hasQ() && !AppUtils.isAppForeground()) {
        // pending() 会标记存入调集LinkedList
        navigator.pending().navigation(activity) 
    } else {
        navigator.navigation(activity)
    }
}
// Application监听
class ApplicationObserver : DefaultLifecycleObserver {
    override fun onResume(owner: LifecycleOwner) {
        super.onResume(owner)
        // 应用重进onResume,把原先pending()存入调集的navigation,从头取出全部履行
        // sendPendingNavigator是Navigator的尖端函数
        sendPendingNavigator() 
    }
}

– 直接获取Intent目标

  大部分的路由结构都不供给直接返回Intent,可是有时候咱们又只需求对应其他模块的intent目标并不需求跳转,例如构建系统告诉栏的点击需求传入PendingIntent,或许需求经过Intent目标构建。

// 获取intent
val intent = TheRouter.build("test://login/hello").createIntent(activity)

– 动态下发路由表的『骚操作』

   为什么我个人说这是『骚操作』呢?咱们以前写一个页面,页面溃散了,那么咱们就想方法修正,让用户先忍忍。可是用你这个APP的人真的能忍受你的溃散吗?答案是不能的,因而咱们想尽各种方法例如热修正等等,可是仍是有没有经过热修正的人溃散了,仍是大面积的溃散。

  那动态下发路由表,让这个溃散页面的路由改下其他页面,例如这个溃散页面的路由跳转H5页面,告知用户正在紧急修正,这样的过渡会比直接溃散运用感触好。

  当然不止这个场景,再举例一个咱们最常见的,例如A页面忘了给相机权限,然后上线了跳转A页面的时候才发现少了这个权限,咋整?重发版呗。可是如果用TheRouter,能够在原工程预留一个过渡页面,咱们动态下发路由表,跳到这个过渡页获取权限了再从头跳转原来A页面。

// 获取远端的路由map
/**
[
    {
        "path":"test://home/webview/pre",
        "action":"test://action/start_activity?path=test://app/alert?type=-1&permissionJson={"android.permission.READ_PHONE_STATE": "需求获取您的手机网络状况"}",
        "description":"",
        "className":"com.test.main.PreWebViewV2Activity",
        "params":{
        }
    }
]
// action说明: 能够写一个test://app/alter权限弹窗页面,传入permissionJson参数授权,授权成功之后再从头履行原来的路由地址
*/
fun getServiceRouterMap() {
    try {
        val gson = "注释供给的格局"
        if (gson.isNullOrEmpty()) {
            return
        }
        Kv.putEnv(LOCAL_ROUTER_MAP, gson) // 本地存储,方便下次取出
        mRouteItem = GsonUtils.fromJson(gson, object : TypeToken<List<RouteItem?>?>() {}.type)
    } catch (e: Exception) {
        Log.d("updateRouterMap", e?.toString())
    }
}
// 把远端路由遍历增加到本地
fun addMdapRouteMap() {
    Log.d("HllMarsConfigTask", "asyncInitRouteMap")
    var list = mRouteItem
    if (list != null && list.size > 0) {
        // 主张远端下发路由表差异部分,用远端包覆盖本地更合理
        addRouteMap(list) // TheRouter库RouteMap.kt供给尖端函数
    }
}
// 以下是TheRouter库RouteMap.kt类
// 详细完成:怎么把远端路由增加到本地
@Synchronized
fun addRouteMap(routeItemArray: Collection<RouteItem>?) {
    if (routeItemArray != null && !routeItemArray.isEmpty()) {
        for (entity in routeItemArray) {
            addRouteItem(entity)
        }
    }
}
@Synchronized
fun addRouteItem(routeItem: RouteItem) {
    var path = routeItem.path
    if (path.endsWith("/")) {
        path = path.substring(0, path.length - 1)
    }
    debug("addRouteItem", "add $path")
    ROUTER_MAP[path] = routeItem
    onRouteMapChangedListener?.onChanged(routeItem)
}

– 和Arouter功用比较

  以阿里的Arouter来说,它是有比较沉重的前史包袱,尽管后边有迭代几个版别来优化,可是更多的仍是在前史基础上优化,TheRouter却没有前史包袱。下面是咱们自己工程跑的比照作用

我为什么用TheRouter而不玩Arouter了呢