写不完的BUG---记录一次ARouter使用问题

1,804 阅读2分钟

久闻ARouter大名,但是却从没用过,所以在自己一个Demo项目里面尝试去了解一下,但是不知道为什么项目里面有一个Activity设置了TaskAffinity(可能是某个时刻我在学习TaskAffinity的时候加的,大雾),然后我在不停的navigation的时候,TaskId从1346变为了1347,继续navigation,又变成了1346,当时的内心就是:什么鬼

如果按照正常的使用Intent方法来去startActivity,那么1347之后的Activity所在的TaskId都将为1347,他们都会在这个1347的Task上面,毕竟是以standard模式去启动的。前面了解过,在startActivity的时候,会调用到getReusableIntentActivity方法,在里面去获取可以复用的Task上的ActivityRecord,但是该方法是排除了standard和singleTop的,在寻找Task的时候是根据了它们的TaskAffinity是否相同,由于只有一个Activity设置了该值,其余未设置的Activity它们的TaskAffinity都是相同的,所以啊,小蝌蚪找妈妈,找到了1346上面去了,由此可以得出navigation方法里面应该是帮Intent设置了一个FLAG_ACTIVITY_NEW_TASK,到底是不是还是看下源码吧。

强势插一句使用方式ARouter.getInstance().build("").navigation()

Postcard.java

//可以看到吧context设置为了null
public Object navigation() {
    return navigation(null);
}

public Object navigation(Context context) {
    return navigation(context, null);
}

public Object navigation(Context context, NavigationCallback callback) {
    return ARouter.getInstance().navigation(context, this, -1, callback);
}

ARouter.java

public Object navigation(Context mContext, Postcard postcard, int requestCode, NavigationCallback callback) {
    return _ARouter.getInstance().navigation(mContext, postcard, requestCode, callback);
}

_ARouter.java

protected Object navigation(final Context context, final Postcard postcard, final int requestCode, final NavigationCallback callback) {
  //省略其余代码
  if (!postcard.isGreenChannel()) {
    //未设置默认不进入
  } else {
    //重点看这里
    return _navigation(context, postcard, requestCode, callback);
  }
}


private Object _navigation(final Context context, final Postcard postcard, final int requestCode, final NavigationCallback callback) {
    //此时context为null,所以值为mContext,从init方法可以看到,该值为application
    final Context currentContext = null == context ? mContext : context;
    switch (postcard.getType()) {
        case ACTIVITY:
            // Build intent
            final Intent intent = new Intent(currentContext, postcard.getDestination());
            intent.putExtras(postcard.getExtras());

            int flags = postcard.getFlags();
            //由于非Activity去startActivity的时候是需要加上FLAG_ACTIVITY_NEW_TASK
            //假如自己设置了Flag,但是未设置FLAG_ACTIVITY_NEW_TASK依旧会导致崩溃
            if (-1 != flags) {
                intent.setFlags(flags);
            } else if (!(currentContext instanceof Activity)) {
                //此时currentContext是application,设置了FLAG_ACTIVITY_NEW_TASK
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            }

            // Set Actions
            String action = postcard.getAction();
            if (!TextUtils.isEmpty(action)) {
                intent.setAction(action);
            }

            // Navigation in main looper.
            runInMainThread(new Runnable() {
                @Override
                public void run() {
                    startActivity(requestCode, currentContext, intent, postcard, callback);
                }
            });

            break;
        ...
  }
}


protected static synchronized boolean init(Application application) {
    mContext = application;
    LogisticsCenter.init(mContext, executor);
    logger.info(Consts.TAG, "ARouter init success!");
    hasInit = true;
    mHandler = new Handler(Looper.getMainLooper());

    return true;
}

从上面的源码可以看到,navigation()默认帮intent添加了设置了FLAG_ACTIVITY_NEW_TASK,如果不想要,使用navigation(Context context)就可以了,如果想与众不同,给每个Activity都写上TaskAffinity也可以,也没什么问题是吧。