话不多说,先上图。
talk is cheap,show me the code。
- 其实代码很简单 只需要在manifest中设置两个属性即可。
<activity android:name=".SecondActivity"
android:taskAffinity="com.gitzzp.ex"
android:launchMode="singleTask"
></activity>
singleTask,栈内复用模式,只要Activity在一个栈中存在,那么多次启动此Activity都不会重新创建实例。这个大家都比较熟悉,此外,该模式还有一个需要注意的地方,就是当一个Activity启动的时候,比如Activity A启动的时候,系统首先会寻找是否存在Activity A所需要的任务栈,如果不存在,就会创建一个任务栈,然后创建A的实例放进该任务栈中,如果任务栈已经存在,那么就要看任务栈中是否有A的实例,如果有,系统会将A调到栈顶并调用他的onNewIntent方法,如果不存在,会创建A的实例并压入栈中。
那么怎么指定任务栈呢?这就需要用到另一个属性了,taskAffinity,这个属性标识了一个Activity所需要的任务栈的名称,默认的情况下,所有的activity所需的任务栈的名字均为包名,我们这里为SecondActivity制定了一个与应用包名不同的任务栈名称。
当这两个属性同时指定的时候,就会形成上边图中的效果,一个应用程序中有两个可显示的任务栈,多任务栈之间可以自由切换。类似微信小程序启动之后,小程序与微信客户端之间的关系。
这里有一些问题需要说明:
- TaskAffinity和singleTask属性必须同时使用,否则无效。
- 当TaskAffinity和singleTask启动模式配对使用的时候,待启动的Activity会运行在名字和TaskAffinity相同的任务栈中。
- 多任务栈的情况下,后台任务栈中的Activity全部处于暂停状态。
- 还有一种情况需要考虑,假设我们目前有两个任务栈,前台任务栈中有A和B,后台任务栈中有C和D,那么我们现在从B中请求启动D,此时后台任务栈会整个被切换到前台,此时按返回键依次会返回到C->B->A,这时的情况就类似我们从微信打开小程序,小程序中打开几个页面,然后微信来消息了,点开消息(将后台任务栈切回前台),按返回键,会返回到微信主界面,再按返回键,会返回到小程序,再按返回键,会回退小程序界面,最后,会返回到桌面。
- 继续上边的话题,如果我们从B中请求C,那么整个后台任务栈切回前台,此时按返回键依次会返回到B->A->桌面,因为singleTask启动模式自带cleanTop属性,D被弹出栈外。
本文介绍了如何在微信小程序中实现多任务栈效果,通过设置`singleTask`和`taskAffinity`属性,实现类似微信小程序启动后,小程序与微信客户端间的任务栈切换。在多任务栈场景下,后台任务栈中的Activity会处于暂停状态,详细阐述了不同启动模式下的Activity行为,以及返回操作的逻辑流程。

330

被折叠的 条评论
为什么被折叠?



