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);

全局拦截器可以用来记录路由寻址的数据或者用于进行埋点统计等

三) 执行流程图

拦截器执行流程图