久闻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也可以,也没什么问题是吧。