前面分析到 _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;
}
我省略了一些代码,方法的大致思路是这样的,
- 先通过 navigation() 方法获取 PretreatmentService 对象做预处理,假设对象为 null,就结束了,我这里省略了部分代码。
- 接着会对 postcard 进行 completion,这步之前分析过了,主要是获取路由信息赋值给 postcard。
- 默认情况下 postcard 没有配置绿色通道,所以会做一步拦截处理,这里可以利用 callback 回调做想要的拦截处理
- 接着会执行 _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 过程是如何找到路由信息的,后续会再继续分析。
网友评论