这个模式和singleTask差不多,因为他们在系统中都只有一份实例。唯一不同的就是存放singleInstance Activity实例的Task只能存放一个该模式的Activity实例。如果从singleInstance Activity实例启动另一个Activity,那么这个Activity实例会放入其他的Task中。同理,如果singleInstance Activity被别的Activity启动,它也会放入不同于调用者的Task中。
虽然是两个task,但是在系统的任务管理器中,却始终显示一个,即位于顶部的Task中。另外当我们从任务管理器进入这个应用,是无法通过返回键会退到Task1的。
好在有办法解决这个问题,就是之前提到的taskAffinity="",为launchMode为singleInstance的Activity加入这个属性即可。
1
2
3
4
5
6
<activity
android:name=".SingleInstanceActivity"
android:label="singleInstance launchMode"
android:launchMode="singleInstance"
android:taskAffinity="">
</activity>
再次运行修改的代码,查看任务管理器,这样的结果就合理了。
使用情况这种模式的使用情况比较罕见,在Launcher中可能使用。或者你确定你需要使Activity只有一个实例。建议谨慎使用。
Intent Flags除了在manifest文件中设置launchMode之外,还可以在Intnet中设置flag达到同样的效果。如下述代码就可以让StandardActivity已singleTop模式启动。
1
2
3
Intent intent = new Intent(StandardActivity.this, StandardActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
关于Intent Flags这里暂不做重点介绍,具体可以参考