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却没有前史包袱。下面是咱们自己工程跑的比照作用