Activity的启动模式

学习目标

理解Activity的启动模式

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

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

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

  • standard: 标准模式

系统的默认模式。一种多实例模式,每次启动一个Activity都会重新创建一个新的实例。被启动的Activit会被放入启动者的栈中,如果启动者是除Activity之外的Context,如Application,此时没有任务栈,就会报错,
此时需指定FLAG_ACTIVITY_NEW_TASK标记位,创建一个新栈。没有特殊需求都默认是这种模式。

  • singleTop: 栈顶复用模式

如果一个Activity的实例已经在栈顶存在,启动这个Activity时,不会创建新的Activity,而是回调onNewIntent方法,如果不是在栈顶存在,则创建一个新的实例。
适合接收通知启动的内容显示页面,当接收到多条新闻推送时,用户展示新闻的Activity设置成此模式,根据传过来的intent数据显示不同的新闻信息,不会起动多个activity。

  • singleTask: 栈内复用模式

一种单实例模式,只要Activity的实例在一个栈中存在,再一次启动Activity时都不会重新创建实例,只回调onNewIntent方法,并从栈中清空这个Activity实例上的所有Activity实例。
适合作为程序的入口点,例如浏览器的主页面,不管多少应用启动浏览器,只会启动主页面一次,其余情况都只回调onNewIntent方法,并且会清空主页面上的其他页面。

  • singleInstance: 单实例模式

具有singleTask的所有特性,设置此模式的Activity只能单独存在在一个任务栈中。

一个例子:闹铃响铃页面,你在16点设置了一个闹钟,在15点58的时候,你启动了闹钟设置页面,并按home键返回桌面,在15点59的时候你打开微信和朋友聊天,16点的时候闹钟响了,并且弹出一个对话框形式的Activity (AlarmAlertActivity,这个Activity是以singleInstance模式打开的)提示你16点到了,这时候你按返回键,返回的是微信聊天页,不是闹钟设置页面,因为AlarmAlertActivity以singleInstance模式打开,栈里只有它一个实例,退出后这个任务栈空了,如果以singleTask打开,这时候返回的是闹钟设置页面。

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

onNewIntent

在singleTop、singleTask、singleInstance模式下再次启动相同的Activity,如果期望只有一个实例存在,再次启动就会调用onNewIntent,在onNewIntent中可以通过调用setIntents刷新Intent数据

onConfigurationChanged

当Android设置正在运行app时,如果设备的语言,屏幕方向,键盘的参数改变了,默认会销毁当前Activity并重新创建一次Activity来重新加载新的配置信息。为了防止系统销毁,可以再AndroidManifest.xml文件中给Activity设置android:configChanges属性,可选值有["mcc","mnc","locale","touchscreen","keyboard","keyboardHidden", "navigation","screenLayout","fontScale","uiMode", "orientation","density","screenSize","smallestScreenSize"],申明的配置发生改变时,将不会重启Activity,而是回调onConfigurationChanged方法。如果设置的属性是orientation,当屏幕方向发生变化的时候,会阻止系统销毁Activity重新创建,而是保持运行,回调onConfigurationChanged方法,我们需要在onConfigurationChanged中做屏幕方向发生改变的操作,onConfigurationChanged会传递一个Configuration对象,通过读取这个对象的配置信息,来自行适配新的UI页面。

注:从Android 3.2(API 13)开始,当设备屏幕方向发生变化的时候,screenSize
也会发生变化,因此需要设置android:configChanges="orientation|screenSize"