美文网首页
_ARouter 的 navigation(Context co

_ARouter 的 navigation(Context co

作者: jkwen | 来源:发表于2021-06-05 08:03 被阅读0次

    前面分析到 _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 co

          本文链接:https://www.haomeiwen.com/subject/gqfqeltx.html