Android DevArt3:SingleTask启动模式探究:首先从MainActivity启动案例入口AActivity,并在A中启动BActivity,从B启动CActivity, 再从C中又启动AActivity, 最后在A中启动B,现在按两次back键,然后回到的是哪个Activity? 答案是,回到MainActivity。

时间:2021-01-18 22:16:04
SingleTask启动模式探究 
GitHub

如题:首先从MainActivity启动案例入口AActivity,并在A中启动BActivity,从B启动CActivity,
再从C中又启动AActivity, 最后在A中启动B,现在按两次back键,然后回到的是哪个Activity?
简单点:Main->A->B->C->A->B->double back->which activity?(MainActivity).
答案是,回到MainActivity。
启动流程:

Android DevArt3:SingleTask启动模式探究:首先从MainActivity启动案例入口AActivity,并在A中启动BActivity,从B启动CActivity, 再从C中又启动AActivity, 最后在A中启动B,现在按两次back键,然后回到的是哪个Activity? 答案是,回到MainActivity。

上图对应的AndroidMenifest.xml配置:

<!--Android启动模式之SingTask探究-->
<activity
android:name=".Chapter1.launchmode.ALActivity"
android:launchMode="standard" />
<activity
android:name=".Chapter1.launchmode.BLActivity"
android:launchMode="singleTask"
android:taskAffinity="com.art.singletask1" />
<activity
android:name=".Chapter1.launchmode.CLActivity"
android:launchMode="singleTask"
android:taskAffinity="com.art.singletask1"></activity>

入栈模型:

Android DevArt3:SingleTask启动模式探究:首先从MainActivity启动案例入口AActivity,并在A中启动BActivity,从B启动CActivity, 再从C中又启动AActivity, 最后在A中启动B,现在按两次back键,然后回到的是哪个Activity? 答案是,回到MainActivity。

全文重点!!!

从C跳转到A,因为A是standard,系统会为A创建一个新的实例并将A添加到启动它的那个Activity(即C)所在的任务栈中:

Android DevArt3:SingleTask启动模式探究:首先从MainActivity启动案例入口AActivity,并在A中启动BActivity,从B启动CActivity, 再从C中又启动AActivity, 最后在A中启动B,现在按两次back键,然后回到的是哪个Activity? 答案是,回到MainActivity。

通过上图可知,此时com.art.singletask1栈中的有三个实例:BCA。

此时,从A启动B,由于B的launchMode为singleTask(栈内复用模式),工作模式为“后进先出”,B要回到栈顶的话,只能是AC出栈。

Android DevArt3:SingleTask启动模式探究:首先从MainActivity启动案例入口AActivity,并在A中启动BActivity,从B启动CActivity, 再从C中又启动AActivity, 最后在A中启动B,现在按两次back键,然后回到的是哪个Activity? 答案是,回到MainActivity。

到这里就好理解了,back第一下,退出处于上层的B,第二次,退出左边的A,显示MainActivity。分析到这里,可以得出结论,singleTask模式的Activity切换到栈顶时,会导致它上面的栈内的所有Activity出栈。

GitHub