启动模式一共有4种,分别是standard、singleTop、singleTask、singleInstance,可以在AndroidManifest.xml中通过给<activity>标签指定android:launchMode属性来选择启动模式。
1、Standard
1.1、 standard是Activity默认的启动模式,对于使用standard模式的Activity,系统不会在乎这个Activity是都已经在返回栈中存在,每次启动都会创建一个该Activity的新实例。
通过日志查看每次点击出现的FirstActivity实例
1.2、standard模式的原理:
standard模式原理图
2、singleTop
2.1、当Activity的启动模式指定为SingleTop,在启动Activity时如果发现返回栈的栈顶已经是该Activity,则认为可以直接使用它,不会再创建新的Activity实例。
在Manifest.xml中修改启动模式之后点击前面的按钮查看日志
2.2、当FirstActivity并未处于栈顶的位置时,再启动FirstActivity还是会创建新的实例的。(从FirstActivity跳转进入SecondActivity,再从SecondActivity跳转进入FirstActivity便会创建新的FirstActivity实例,代码如下)
修改点击事件跳转到SecondActivity
SecondActivity中修改点击事件跳转到FirstActivity
2.3、singleTop模式原理:
singleTop模式原理图
3、singleTask
3.1、当Activity的启动模式指定为singleTask,每次启动该Activity时,系统首先会在返回栈中检查是否存在该Activity的实例,如果发现存在,则直接使用该实例,并把在这个Activity之上的所有其他Activity全部出栈,如果没有发现就会创建一个新的Activity实例。(在SecondActivity中启动FirstActivity,会发现返回栈中已经存在一个First Activity,并且是在SecondActivity的下面,于是SecondActivity会从返回栈中出栈,而FirstActivity重新成为了栈顶的Activity,因此FirstActivity的onRestart()方法和SecondActivity的onDestroy()方法会得到执行)
在Manifest.xml中修改FirstActivity的启动模式为singleTask
在FirstActivity中添加onRestart方法并打印日志
在SecondActivity中添加onDestroy方法并打印日志
3.2、singleTask模式原理:
singleTask模式原理图
4、singleInstance
4.1、指定为singleInstance模式的Activity会启用一个新的返回栈来管理这个Activity(如果singleTask模式指定了不同的taskAffinity,也会启用一个新的返回栈)。
4.2、适用于程序中有一个Activity是允许其他程序调用的情况下,可以实现跟其他程序共享该Activity的实例。
4.3、在FirstActivity界面点击按钮进入SecondActivity,然后在SecondActivity界面点击按钮进入ThirdActivity。可以从日志中发现,SecondActivity的返回栈地址不同于FirstActivity和ThirdActivity,说明SecondActivity确实存放在一个单独的返回栈里,而这个栈中只有SecondActivity这一个Activity。
将SecondActivity的启动模式设置为singleInstance
打印当前返回栈的id
打印当前返回栈的id,修改按钮点击事件跳转到ThirdActivity
打印当前返回栈的id
4.4、按下Back键进行返回,ThirdActivity直接返回到了FirstActivity,再按下Back键会返回到SecondActivity,再按下Back键才会退出程序。
4.5、singleInstance模式原理:
singleInstance模式原理图
Demo地址:https://gitee.com/aaron222/activitytest.git











网友评论