1、Activity的启动模式有哪几种,分别用于什么场景?
standard : 标准模式
这也是系统默认模式。每次启动Activity都会重新创建一个新的实列。不管这个实列是否存在。如果是用Context 去启动一个
Activity的话,这时候会报错如下错误:
Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the
FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
这是因为标准模式会启动它的Activity所谓的任务栈中,但是非Activity类型是没有任务栈的,所以就会出现上面的问题了。解决
这个问题的方法是: 启动Activity指定Flag 为: FLAG_ACTIVITY_NEW_TASK 标记位,这样启动的时候就会为它创建一个新的任
务栈。相当于singleTask模式
singleTop : 栈顶复用模式
如果新Activity已经位于任务栈的栈顶,那么此Activity不会被创建,同时会调用onNewIntent()方法,通过此方法的参数我们取出当
前请求的信息。此时此Activity的onCreate,onStart 不会被系统调用。假设ABCD 此时D在栈顶中,如果D是栈顶复用模式。么
启动D,这时候任务栈中还是为ABCD 同时onNewIntent()调用,如果D是标准模式。那么启动D,此时的任务栈为ABCDD,
onNewIntent()也不会被调用.
singleTask : 栈内复用模式
这是一种单实列模式,在这种模式下,只要Actvity在一个栈中存在,那么多次启动这个Activity都不会创建实列,和singleTop一样也会调用onNewIntent(). 假设ABCD 任务栈中4个实列,此时B是singleTask 模式,D是栈顶,然后我启动B,这是时候任务栈中为AB两个实列,同时由于singleTask默认有clearTop的效果,会导致栈内所有在B上面的Activity全部出栈。所以此时任务栈中只有AB 两实列
singleInstance :
单实例模式具有singleTask所有的特性,但是还有一点就是此模式是运行在单独一个任务栈中的。比如有个A->Activity为singleInstance模式,当其他Activity 启动A时,系统会为它创建一个新的任务栈,然后A运行在这个独立栈中。如果这个A-->
Actvity 是个Android 闹铃界面,然后我去设置一个10点起床闹钟,然后按home键回到桌面,此时你打开B->Activity。然后等到10点钟此时A-->Activity 加载出来了,此时A就是用singleInstance模式来启动的,你按Back键返回,此时会回到了B-->Activity.
如果用的singleTask模式的话,你按Back键返回此时应该回到 设置闹铃的界面。而不是B-->Activity
2、清晰地描述下onNewIntent和onConfigurationChanged这两个生命周期方法的场景?
(1)onNewIntent()
在singleTop,singleTask,singleInstance 模式下的Activity,再次启动相同的Activity都会被调用
(2)onConfigurationChanged
onConfigurationChanged 当系统配置信息发生改变时会调用.当在改变屏幕方向、弹出软件盘和隐藏软键盘时等,不再去执行
onCreate()方法,而是直接执行 onConfigurationChanged不过需要在AndroidManifest.xml中为Activity加上
android:configChanges=“orientation|keyboard|screenSize” 这个属性, 如果没有在xml中配置,系统发生改变后会销毁当前
Activity然后重新创建一个新的Activity,重新执行一次生命周期,不会执行onConfigurationChanged 方法
常有的属性:
orientation| screenSize 屏幕旋转 自从Android 3.2(API 13),screen size也开始跟着设备的横竖切换而改变。所以需要加上
screenSize
网友评论