arouter-api version : 1.4.1
前言
前几天对 ARouter 的页面跳转源码进行了分析,趁着今天有空,就讲讲 ARouter 里面的拦截器吧。
ARouter 拦截器的使用方法在这就不多说了,不了解的同学可以去 GitHub 上看看。那就直接进入正题了。
拦截器解析
把视线转移回 ARouter 的 init 方法
1 | public static void init(Application application) { |
在 init 中,判断了初始化完成后,调用了 _ARouter.afterInit()
来初始化拦截器,跟进代码去看看。
1 | static void afterInit() { |
发现有个 InterceptorService ,InterceptorService 就是用来控制拦截的服务组件,来看看它的接口是怎么定义的
1 | public interface InterceptorService extends IProvider { |
之前我们分析过,IProvider 也是可以用 ARouter.getInstance().build("xxx").navigation()
的形式获取的。关键的代码在 LogisticsCenter 的 completion 方法中
1 | /** |
可以看到,如果是 PROVIDER 类型的,就会反射出一个单例对象,并且设置为绿色通道(即不受拦截器的影响)。更详细的代码就不过多介绍了,不理解的同学可以结合着上一篇博客私下回去再看。
所以其实在 afterInit 方法中,只是获取到了 InterceptorService 的实例对象,我们根据上面的 “/arouter/service/interceptor” 可以很轻松的查到,InterceptorService 接口的实现类就是 InterceptorServiceImpl
1 | @Route(path = "/arouter/service/interceptor") |
我们先来看 InterceptorServiceImpl 的 init 方法。
在 init 方法中,做的主要事情就是遍历所有 IInterceptor class 并创建出对象,调用其 init 方法,完成初始化操作。
初始化完成之后,InterceptorService又是在哪里被使用的呢?
我们在 _ARouter 的 navigation 方法里可以看到它的踪迹:
1 | protected Object navigation(final Context context, final Postcard postcard, final int requestCode, final NavigationCallback callback) { |
如果不是绿色通道的话,就会启动拦截器去进行拦截。
1 | @Override |
上面的代码基本上都加了注释了,这里就不再多讲了。
到这里整个 ARouter 拦截器的流程就差不多讲完了,如果还有哪里不懂的地方可以在评论区留言。
再见👋