理解activity的启动模式

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

  • standrard:标准模式

系统的默认模式,也就是一种多实例模式,每次启动Activity都会去重新创建一个新的实例,被启动的activity会放入启动者的栈中。如果启动者是Context,没有任务栈,就会报错,需要设置FLAG_ACTIVITY_NEW_TASK标志位,创建一个新栈。如果没有特殊的需求,就默认使用这种模式来启动activity

  • singleTop:栈顶复用模式

如果一个activity的实例已经在栈顶,那么再次启动该activity的时候,不会去创建新的实例,而是会回调该activity的onNewIntent方法。如果不是在栈顶存在的话,那么会创建一个新的实例。适合接收通知启动的内容显示页面,当收到多条新闻推送时,用于展示新闻的activity设置成这种模式,根据传来的intent显示不同的内容,不会启动多个activity。

  • singleTask:栈内复用模式

这是一种单实例模式。在这种模式下,只要这个activity在栈中存在,那么多次启动该activity都不会去重新创建新的实例,该activity上面的所有activity都会出栈,该activity会切换到栈顶。系统会回调该activity的onNewIntent方法。适用于主程序的入口,该activity只会启动一次。

  • singleInstance:单实例模式

这是一种加强的singleTask模式,它除了具有singleTask模式的所有特性外,还加强了一点,就是该模式只能单独地位于一个任务栈中,换句话说,比如A是singleInstance模式,当A启动后,系统会为它创建一个新的任务栈,然后A独自在这个新的任务栈中,后续启动A均不会创建新的实例,除非这个独特的任务栈被系统销毁了。

清晰地描述下onNewIntent和onConfigurationChanged这两个方法的应用场景

  • onNewIntent

在singleTop、singleTask、singleInstance三种模式下,再次启动相同的activity,如果预期只有一个实例存在的话,那么就会调用onNewIntent,可以通过setIntent来刷新页面的数据。

  • onConfigurationChanged

当android设备正在运行app时,如果设备的语言,方向,键盘等参数发生了改变,默认会销毁当前的activity并且重新创建一次来加载新的配置信息。为了防止activity销毁,可以在AndroidManifest.xml文件中给添加android:configChanges属性。

3.2以下的版本只要加上configurations为orientation,生命周期不会重走,onConfigurationChanged()方法被回调
onPause->onStop->onRetainCustomNonConfigurationInstance->onDestroy->onCreate->onStart->onRestoreInstanceState->onResume

3.2以上的版本,需要加上orientation|keyboardHidden|screenSize onConfigurationChanged回调.该方法会传进一个Configuration对象,通过读取该对象里面的配置信息,来自行适配新的UI界面
注意:如果不加screenSize的话,会重新走生命周期。因为3.2以后切换屏幕方向会改变screenSize

你可能感兴趣的:(理解activity的启动模式)