在android应用中,用户使用过程中看到的大部分界面都是Activity,这些Activity是被划分到不同的栈中进行管理的,栈中的Activity符合先进后出的原则,表现为我们在点手机Back键时,逐个界面倒退,直到最初的主界面,然后才会退出应用。
默认情况下,不用去关注Activity的栈区分配问题,会自动由ActivityStackSupervisor来管理,但是某些场景下,对intent下的Activity跳转的要求,在默认模式下无法满足,比如,A应用的Activity1跳转到B应用的Activity2,Activity2又跳转到B应用的Activity3,此时用户按下Home键,应用转后台,此时桌面重新拉起A应用Activity1再想跳转到Activity2会发现跳转到了Activity3,类似的场景要如何处理呢?
通过设置Activity的启动模式和规定ActivityTask栈的属性能恰当的满足这类需求。在AndroidManifest文件中设置Activity的LaunchMode,是决定了该Activity在任务栈中的位置和状态,但是在通过intent从栈A启动不同应用的activity跳转到栈B时,仅仅是设置跳转activity的launchMode并不能满足上面提到的场景需求,因为此时栈A跳转栈B会拉起之前转到后台的栈B,若是栈B此时栈顶的activity是activity3,即使activity2的launchMode是singleTask,也无法实现activity1到activity2的跳转,而是跳转到activity3了。
我们的目标是每次点击此跳转都到acitivity2,所以可想到的方案是,每次跳转时都清空栈B中的activyt,然后重新创建activity2到栈B,完成目标跳转。
android中可以通过设置Intent的flag来实现上面的方案,比如,在startActivty前,设置传入的intent的flag: FLAG_ACTIVITY_NEW_TASK和FLAG_ACTIVITY_SINGLE_TOP,这样在每次跳转前就会先清空之前的任务栈,新启动一个activity到栈中。