Android 理解Activity启动模式

Activity的启动模式有哪几种,分别用于什么场景

standard 标准模式
默认得模式,每次启动一个Activity,都会创建一个新的实例放到任务栈中,但是如果启动者是Context(例如:getApplicationContext())在没有任务栈得情况下会报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? 这个错误,此时Intent需要指定FLAG_ACTIVITY_NEW_TASK来创建一个新的任务栈。
singleTop 栈顶复用模式
当一个Activity设置singleTop时第一次启动不会有任何特殊处理,在第二次启动时,如果此时Activity在任务栈栈顶,则不会创建新的Activity,而是执行Activity得onNewIntent() 方法,如果此时Activity没有在任务栈栈顶,则创新一个新的实例放到任务栈。
应用场景:适合不希望重复创建刚刚打开过的Activity。比如通知栏有多个通知,点开通知跳转的Activity就可以用singleTop
singleTask 栈内复用模式
当一个Activity设置singleTask时第一次启动不会有任何特殊处理,在第二次启动时,只要任务栈中存在次Activity实例则不会再次创建,只会回调onNewIntent() 方法,并且将任务栈中Activity上面得所有实例全部移除。
应用场景:通常适合作为整个项目MainActivity使用。
singleInstance 单实例模式
当一个Activity设置singleInstance时,会单独存在于一个独立得任务栈中。
应用场景:适合需要与程序分离开的页面。比如闹铃弹出的界面,应用锁弹出的界面等。

清晰地描述下onNewIntent和onConfigurationChanged这两个生命周期方法的场景

通过上面四种Activity启动模式可以得知,在singleTop、singleTast、singleInstance这三种模式下,如果再次启动相同的Activity则不会创建新的实例,也就不会走onCreate()方法,而是直接回调onNewIntent()方法。

在manifest.xml里面可以配置Activity的android:configChanges=”” 属性来捕获手机状态的改变,android:configChanges一共有以下几种属性:
“mcc“ 移动国家号码,由三位数字组成,每个国家都有自己独立的MCC,可以识别手机用户所属国家。
“mnc“ 移动网号,在一个国家或者地区中,用于区分手机用户的服务商。
“locale“ 所在地区发生变化。
“touchscreen“ 触摸屏已经改变。(这不应该常发生。)
“keyboard“ 键盘模式发生变化,例如:用户接入外部键盘输入。
“keyboardHidden“ 用户打开手机硬件键盘
“navigation“ 导航型发生了变化。(这不应该常发生。)
“orientation“ 设备旋转,横向显示和竖向显示模式切换。
“fontScale“ 全局字体大小缩放发生改变
当配置的android:configChanges属性发生改变时,会回调Activity里面的onConfigurationChanged()函数,通常项目中常用的有“orientation““keyboard“等属性

猜你喜欢

转载自blog.csdn.net/mixin716/article/details/80351861