1
2
3
4
5
6
<activity
android:name=".SingleTaskActivity"
android:label="singleTask launchMode"
android:launchMode="singleTask"
android:taskAffinity="">
</activity>
完成上面的修改,我们看一下效果,Task的变化如下图
同时,系统中的任务管理器效果也会相应变化 跨应用之间在跨应用Intent传递时,如果系统中不存在singleTask Activity的实例,那么讲创建一个新的Task,然后创建SingleTask Activity的实例,将其放入新的Task中。Task变化如下。
系统的任务管理器也会如下变化如果singleTask Activity所在的应用进程存在,但是singleTask Activity实例不存在,那么从别的应用启动这个Activity,新的Activity实例会被创建,并放入到所属进程所在的Task中,并位于栈顶位置。
更复杂的一种情况,如果singleTask Activity实例存在,从其他程序被启动,那么这个Activity所在的Task会被移到顶部,并且在这个Task中,位于singleTask Activity实例之上的所有Activity将会被正常销毁掉。如果我们按返回键,那么我们首先会回退到这个Task中的其他Activity,直到当前Task的Activity回退栈为空时,才会返回到调用者的Task。
在上图中,当Task2中的相册启动分享调用Task1中的singleTask Activity,而该Activity实例存在,并位于Task1中回退栈中的第三个位置(从上到下顺序),那么位于该Activity上面的两个Activity实例将会被销毁掉,使得该Activity实例位于栈顶。此时Task1中的回退栈只剩两个Activity,如果点击返回,那么会退到的不是相册应用,而是singleTask Activity栈位置下面的Activity,再次点击返回方可返回相册应用。
使用场景该模式的使用场景多类似于邮件客户端的收件箱或者社交应用的时间线Activity。上述两种场景需要对应的Activity只保持一个实例即可,但是也要谨慎使用这种模式,因为它可以在用户未感知的情况下销毁掉其他Activity。
singleInstance