参考: https://inthecheesefactory.com/blog/understand-android-activity-launchmode/en
Android在内存管理上良好的设计架构,使Acitivity成为Android上最常用的概念,它的出现完美的解决了移动操作系统上的多任务处理。
然而,Activity不仅仅是指显示在屏幕上的界面,启动也值得一看。下面我们就来看一下LaunchMode。
使用LaunchMode
使用很简单,不再赘述,如下
<activity
android:name=".SingleTaskActivity"
android:label="singleTask launchMode"
android:launchMode="singleTask">
只要在AndroidManifest.xml中申明Activity中添加launchMode即可。
一共有四中type,我们一个一个来看。
1. standard
这是默认选择,如果不显示设置,则默认为这个。
这个模式下的Activity每次都是创建一个新的实例用来处理每一个发来的intent。想象一下,如果有十个发给处理邮件的Activity,那么会创建十份实例来单独处理每一个发来的intent。
在Lollipop之前版本的行为
在同一个Task(任务栈)上,每次创建的实例都放到Task的top位置。
如果从其他应用跳转,那么该实例在其他应用所在的task上。比如说这里从Gallery跳转到我们的Activity,那么Activity实例刚在Gallery所在task的top位置,如下图
但是这里有点奇怪,在任务管理器中可以看到,Gallery的task上显示的不是Gallery相关的页面;而且如果想回到Gallery的Activity页面的话,还得从我们的这个Activity中返回才可以。
Lollipop版本的行为
在同一个app中,行为跟pre-Lolipop一致。
但在不同app跳转时,会新建一个task。
这是因为Lolipop版本中修改了Task Management system。这种实现使你在发生跳转后,可以通过切换task返回到原来的应用,而不是非要把当前的activity弹出task任务栈。
2. singleTop
singleTop跟standard模式基本相同。唯一的不同是如果调用者task中已经存在了相同的activity实例并且该实例在task顶部,那么就不会再创建新实例,而是调用该实例的onNewIntent()方法
所以在singleTop模式下,在处理intent的时候,同时需要在onCreate和onNewIntent两个地方考虑好。
singleTop最常见的一个应用场景是搜索页面searchActivity。在搜索某一项结束后,如果再发起搜索,那么应该是原来已经存在的searchActivity再继续处理,而比重新创建一个实例来处理要好。
3. singleTask
该模式跟前面两种显著不同。就如同单例模式一样,该模式只允许该Acitivity实例只有一份。如果该Activity实例已经存在,当intent来的时候,该Activity实例所在的task会调用到top位置,并且触发该Activity实例的onNewIntent方法。
在同一个app内
如果之前没有创建过实例,那么新建一个实例。
但是如果已经创建过实例,那么实例所在的task中该实例上面的所有其他Activity实例都会被销毁(调用生命周期方法);同时我们的activity实例被调用onNewIntent方法。
Google文档中描述到
The system creates a new task and instantiates the activity at the root of the new task.
但是实际上的行文跟文档上有一些不一样。(可以通过dumpsys activity命令查看)
SingleTask模式的Activity仍然占在一个存在task上,而不是重新创建一个新的task。
如果想和Google文档中描述的一致,可以使用taskAffinity属性。
<activity
android:name=".SingleTaskActivity"
android:label="singleTask launchMode"
android:launchMode="singleTask"
android:taskAffinity="">
效果如下图
4. SingleInstance
和singleTask很像。如果singleInstance的实例调用其他activity,那么该acitivity新创建一个task;如果该singleInstance模式的activity被创建,同样的会新创建一个task。