一、拦截器高级用法
1. 多拦截器协同工作
拦截器可以多个同时使用,它们按照优先级顺序执行:
IRouterManager
.getInstance()
.addInterceptor(LoginInterceptor()) // 优先级 1
.addInterceptor(PermissionInterceptor()) // 优先
级 2
.addInterceptor(LogInterceptor()) // 优先级 3
2. 拦截器链的工作原理
拦截器链的执行流程:
- 按照优先级顺序执行拦截器
- 每个拦截器可以选择:
- 继续执行下一个拦截器(调用 chain.proceed(request) )
- 中断拦截器链,直接返回结果
- 所有拦截器执行完成后,执行实际的路由跳转
3. 自定义拦截器示例
class PermissionInterceptor : IRouteInterceptor {
override val priority: Int = 2
override fun intercept(chain: InterceptorChain):
NavigationResult {
val request = chain.request()
// 检查是否需要特定权限
if (needPermission(request)) {
// 检查权限
if (!checkPermission()) {
// 请求权限
requestPermission()
return NavigationResult(false, "需要
权限")
}
}
// 继续执行下一个拦截器
return chain.proceed(request)
}
// 检查是否需要权限
private fun needPermission(request: RouteRequest)
: Boolean {
// 根据路由路径判断是否需要权限
return request.path == "/app/CameraActivity"
}
// 检查权限
private fun checkPermission(): Boolean {
// 检查权限逻辑
return false
}
// 请求权限
private fun requestPermission() {
// 请求权限逻辑
}
}
二、降级策略高级用法
1. 多级降级策略
可以添加多个降级策略,它们会按照添加顺序执行:
IRouterManager
.getInstance()
.addDegradeStrategy(LoginDegradeStrategy()) // 处
理登录失败
.addDegradeStrategy(NetworkDegradeStrategy()) //
处理网络失败
.addDegradeStrategy(DefaultDegradeStrategy()) //
默认降级策略
2. 自定义降级策略示例
class NetworkDegradeStrategy : IDegradeStrategy {
override fun handleDegrade(context: Context,
routeRequest: RouteRequest, error: Throwable):
Boolean {
// 检查是否是网络错误
if (error is NetworkException) {
// 显示网络错误提示
Toast.makeText(context, "网络连接失败,请检
查网络设置", Toast.LENGTH_SHORT).show()
// 跳转到网络设置页面
val intent = Intent(Settings.
ACTION_WIFI_SETTINGS)
context.startActivity(intent)
return true
}
return false // 不是网络错误,交给下一个降级策略处
理
}
}
三、动态路由
1. 什么是动态路由?
动态路由是指在运行时动态添加或修改路由规则,而不需要修改代码或重新编译。
2. 动态路由的使用场景
- 热修复:修复路由路径错误
- 功能开关:根据服务器配置启用或禁用某些功能
- A/B 测试:根据用户分组跳转到不同的页面
3. 动态路由示例
// 动态添加路由
RouterCore.addRoute(
path = "/app/DynamicActivity",
clazz = DynamicActivity::class.java,
group = "app",
needLogin = false
)
// 动态移除路由
RouterCore.removeRoute("/app/OldActivity")
四、路由方法调用
1. 什么是路由方法?
路由方法是指通过路由调用的方法,它可以是任何类中的方法,不限于 Activity 或 Fragment。
2. 路由方法的使用场景
- 跨模块通信:不同模块之间的方法调用
- 服务发现:通过路由路径查找和调用服务
- 功能扩展:动态添加和调用功能
3. 路由方法示例
object MainFragmentParam {
@RouteMethod(path = "/app/method")
fun getAccty(): String {
return "在干嘛呢"
}
@RouteMethod(path = "/app/name")
fun getName(params: Map<String, Any>): String {
return params["name"].toString()
}
// 调用方法:
val result = IRouterManager.getInstance().invokeMethod("/app/method")
Toast.makeText(this@MainActivity, "调用结果: $result", Toast.LENGTH_SHORT).show()
}
五、扩展和定制
1. 自定义路由类型
除了 Activity 和 Fragment,还可以扩展支持其他类型的路由,如:
- Service 路由
- 自定义视图路由
- 远程服务路由
2. 自定义参数处理器
可以自定义参数处理器,支持更多类型的参数:
- 自定义对象参数
- 集合类型参数
- 序列化参数