_ARouter 的 navigation(Context context, Postcard postcard, int requestCode, NavigationCallback cal...

前面分析到 _ARouter 的 navigation 的一个重载方法,这次是接着上次的逻辑继续往下的分析。上次提到,要想用 ARouter 实现页面跳转,先要调用 build 方法,创建出一个 Postcard 对象,再调用该对象的 navigation() 方法,而这次分析的就是 navigation() 这步里的一个主要工作。

protected Object navigation(final Context context, final Postcard postcard, final int requestCode, final NavigationCallback callback) {
    //预处理
    PretreatmentService pretreatmentService = ARouter.getInstance().navigation(PretreatmentService.class);
    LogisticsCenter.completion(postcard);
    if(null != callback) {
        callback.onFound(postcard);
    }
    if(!postcard.isGreenChannel()) {
        interceptorService.doInterceptions(postcard, new InterceptorCallback() {
            @Override
            public void onContinue(Postcard postcard) {
                _navigation(context, postcard, requestCode, callback);
            }
            @Override
            public void onInterrupt(Throwable exception) {
                if (null != callback) {
                    callback.onInterrupt(postcard);
                }
            }
        });
    } else {
        return _navigation(context, postcard, requestCode, callback);
    }
    return null;
}

我省略了一些代码,方法的大致思路是这样的,

  1. 先通过 navigation() 方法获取 PretreatmentService 对象做预处理,假设对象为 null,就结束了,我这里省略了部分代码。
  2. 接着会对 postcard 进行 completion,这步之前分析过了,主要是获取路由信息赋值给 postcard。
  3. 默认情况下 postcard 没有配置绿色通道,所以会做一步拦截处理,这里可以利用 callback 回调做想要的拦截处理
  4. 接着会执行 _navigation(context, postcard, requestCode, callback) 方法。
private Object _navigation(final Context context, final Postcard postcard, final int requestCode, final NavigationCallback callback) {
    final Context currentContext = null == context ? mContext : context;
    switch (postcard.getType()) {
        case ACTIVITY:
            final Intent intent = new Intent(currentContext, postcard.getDestination());
            intent.putExtras(postcard.getExtras());
            int flags = postcard.getFlags();
            if (-1 != flags) {
                intent.setFlags(flags);
            } else if (!(currentContext instanceof Activity)) {
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            }
            String action = postcard.getAction();
            if (!TextUtils.isEmpty(action)) {
                intent.setAction(action);
            }
            runInMainThread(new Runnable() {
                @Override
                public void run() {
                    startActivity(requestCode, currentContext, intent, postcard, callback);
                }
            }
            break;
        case PROVIDER:
            return postcard.getProvider();
        //其他情况都省略
    }
    return null;
}

_navigation() 方法里主要的工作就是根据 type 来区分处理,那对 ACTIVITY 来说,会事先从 postcard 里获取一些字段值来准备 Intent 以及其他配置属性,最后确保启动 Activity 是在主线程里执行(这里如果当前线程不是主线程的话,就会用到初始化时创建的 Handler 对象)。

以上就是用 ARouter 实现 Activity 跳转的主要逻辑分析,但这期间其实还有一些环节需要再解释的,例如 completion 过程是如何找到路由信息的,后续会再继续分析。

你可能感兴趣的:(_ARouter 的 navigation(Context context, Postcard postcard, int requestCode, NavigationCallback cal...)