Tutorial Interceptor - SharryChoo/SRouter GitHub Wiki
拦截器使用
SRouter 的所有拦截器均在主线程执行, 提供了局部和全局两种类型的拦截器
- 局部拦截器包含路由拦截器、页面拦截器和模板方法拦截器
- 支持拦截器按照优先级排序
一) 拦截器的定义
拦截器的定义需要实现 IInterceptor 接口
public class PermissionInterceptor implements IInterceptor {
@Override
public void intercept(@NonNull Chain chain) {
// 责任链上下文 ChainContext
ChainContext chainContext = chain.chainContext();
// 路由发起时的 Context
Context context = chainContext.getBaseContext();
// 上游分发的 Request
Request request = chainContext.request;
// 向下分发
chain.dispatch();
}
}
- Chain: 描述分发的责任链
- Chain.chainContext(): 获取责任链的上下文
- 通过上下文对象可以获取上游的所有数据
- chain.dispatch(): 若需要继续往下分发, 需要主动调用该方法
拦截器实现完成之后, 还可以选择使用 @RouteInterceptor 标注, 拓展拦截器优先级排序的功能支持, 如下所示
@RouteInterceptor(
value = ModuleConstants.Personal.PERMISSION_INTERCEPTOR,
priority = 2
)
public class PermissionInterceptor implements IInterceptor {
......
}
- value: 拦截器的唯一标识符 URI
- priority: 拦截器的优先级
- range in [0, 10] 逐级递增, 路由跳转时会根据优先级进行排序
二) 拦截器的使用
SRouter 的拦截器根据使用场景, 可以分为如下几种类型
- 局部拦截器
- 路由拦截器
- 页面拦截器
- 模板方法拦截器
- 全区拦截器
接下来对其使用方式进行逐一介绍
1. 局部拦截器
1) 路由拦截器
路由拦截器是指在构建寻址请求时添加的拦截器
- 支持通过拦截器 URI 添加拦截器
- 通过 URI 添加的拦截器, 可以享受优先级排序
- 支持直接添加拦截器对象
- 这种方式当做最高优先级处理
SRouter.request(xxx, xxx)
// 添加拦截器的 URI
.addInterceptorURI(ModuleConstants.Personal.PERMISSION_INTERCEPTOR)
// 添加拦截器对象
.addInterceptor(new PermissionInterceptor())
......
2) 页面拦截器
页面拦截器集成在了 @Route 注解中, 只支持通过拦截器的 URI 进行添加
- 支持添加多个页面拦截器
@Route(
authority = ModuleConstants.Personal.NAME,
path = ModuleConstants.Personal.PERSONAL_ACTIVITY,
// 指定跳转到该页面, 要经过的拦截器
interceptorURIs = [ModuleConstants.login.LOGIN_INTERCEPTOR],
desc = "个人中心页面"
)
class PersonalActivity : AppCompatActivity() {
}
3) 模板方法拦截器
模板方法拦截器集成到了 @RouteMethod 注解中, 只支持通过拦截器的 URI 进行添加
- 支持添加多个页面拦截器
public interface RouteApi {
@RouteMethod(
authority = ModuleConstants.Personal.NAME,
path = ModuleConstants.Personal.PERSONAL_ACTIVITY,
// 在方法注解中添加静态拦截器
interceptorURIs = ModuleConstants.Personal.PERMISSION_INTERCEPTOR
)
ICall personalCenter(
Context context,
@QueryParam(key = "content") String content,
@RequestCode int requestCode,
@Flags int flags
);
}
2. 全局拦截器
全局拦截器即添加之后作用于全局的拦截器, 使用方式如下
// 添加全局拦截器对象
SRouter.addGlobalInterceptor(xxx);
// 添加全局拦截器 URI
SRouter.addGlobalInterceptorUri(xxx);
全局拦截器可以用来记录路由寻址的数据或者用于进行埋点统计等