Activity的启动模式
一、启动模式有几种,分别用于哪些场景
-
1、standard 默认模式
系统默认的启动方式,这个启动方式每次都会创建新的实例,每次点击standard模式创建activity后,都会创建新的activity覆盖在原activity上
-
2、singleTop
在启动时,系统会判断当前栈顶activity是不是要启动的activity,如果是则不会创建新的activity而直接引用这个activity;如果不是则创建新的activity。
通常用于接收到消息之后显示的界面。
这个启动方式虽然在栈顶存在目标activity的时候不会创建新的实例,但是会在启动时调用onNewIntent()方法。
目标activity A
不会创建:A-B 栈顶是A
会创建: B-A 栈顶是B
-
3、singleTask
和singleTop相似,只不过singleTop是检测栈顶元素是否是需要启动的activity,而singleTask是检测整个activity栈中是否存在当前需要启动的activity,如果存在则将该activity置于栈顶,并将activity以上的activity都销毁。
如果启动的模式为singleTask的activity已经在后台一个任务栈中,那么启动后,后台的这个任务栈将被切换到前台,这种模式适用于退出整个应用:
将主activity设为singleTask模式,然后在要退出的activity中转到主activity,从而将主activity之上的activity都清除,然后重写主activity的onNewIntent(),在方法中加上一句finish(),将最后一个activity结束掉。目标Activity A
不会创建:
A-B 栈顶是A
B-A 栈顶是B,打开A是会把B销毁
会创建 : B-C 栈中不存在A,会创建
-
4、singleInstance
类似浏览器工作原理
申明为singleInstance的activity会出现在一个新的任务栈中,而且该任务栈中只存在这一个activity。常用于需要与程序分离的界面
二、Intent Flag 启动模式
-
Intent.FLAG_ACTIVITY_NEW_TASK
使用一个新的Task来启动一个Activity,当启动的每个Activity都将在一个新的Task中。
该Flag通常使用在从Service中启动Activity的场景,由于在Service中并不存在Activity栈,所以使用该Flag来创建一个新的Activity栈,并创建新的实例
-
Intent.FLAG_ACTIVITY_SINGLE_TOP
使用该Flag来启动一个activity,与指定 Android:launchMode=“singleTop”效果一样
-
Intent.FLAG_ACTIVITY_CLEAR_TOP
使用该Flag来启动一个activity,与指定 Android:launchMode=“singleTask”效果一样
-
Intent.FLAG_ACTIVITY_NO_HISTORY
使用该Flag启动activity,当该activity启动其他activity后,该activity就会消失了,不会保留在activity栈中,
三、清晰地描述下 onNewIntent 和 onConfigurationChanged 这两个生命周期方法的场景?
-
1、调用onNewIntent的场景:
(a)启动模式SingleTop,如果栈顶是目标Activity时则调用onNewIntent
(b)启动模式SingleTask,如果栈内存在目标Activity是则不会创建实例,调用onNewIntent
-
2、调用onConfigurationChanged
在manifest 声明的activity中加入
android:configChanges="orientation|keyboard|keyboardHidden|screenSize"
在屏幕旋转或屏幕大小改变或软键盘弹出或软键盘隐藏就会调用
onConfigurationChanged();
如果没有加声明,activity在上述情况改变是会重建