public void run() {
startActivity(requestCode, currentContext, intent, postcard, callback);
}
});
break;
case PROVIDER:
return postcard.getProvider();
case BOARDCAST:
case CONTENT_PROVIDER:
case FRAGMENT:
Class fragmentMeta = postcard.getDestination();
Object instance = fragmentMeta.getConstructor().newInstance();
if (instance instanceof Fragment) {
((Fragment) instance).setArguments(postcard.getExtras());
} else if (instance instanceof android.support.v4.app.Fragment) {
((android.support.v4.app.Fragment) instance).setArguments(postcard.getExtras());
}
return instance;
} catch (Exception ex) {
}
return null;
}
可以看到根据postcard中对应的目标Type,有不同的处理方式。例如ACTIVITY代表调转,FRAGMENT则会创建一个对应的对象并返回。
3. ARouter拦截器
public interface IProvider {
void init(Context context);
}
public interface IInterceptor extends IProvider {
void process(Postcard postcard, InterceptorCallback callback);
}
ARouter中自定义的拦截器需要继承IInterceptor,并重写init
和process
方法。init方法在ARouter初始化时会被调用一次。具体的流程图为:
ARouter.init() -> _ARouter.afterInit()->InterceptorServiceImpl.init()->IInterceptor.init()
ARouter中拦截器的操作从doInterceptions开始,通过默认的线程池开启一个线程来执行拦截器的拦截操作。每一层的拦截器执行完后,需要调用onContinue
交还ARouter控制权,执行下一层拦截器,或者调用onInterrupt
中断路由。
public void doInterceptions(final Postcard postcard, final InterceptorCallback callback) {
LogisticsCenter.executor.execute(new Runnable() {
@Override
public void run() {
_execute(0, interceptorCounter, postcard);
if (interceptorCounter.getCount() > 0) { // Cancel the navigation this time, if it hasn’t return anythings.