您的位置:首页 > 其它

Activity的四种启动模式

2017-12-04 18:08 351 查看
1、Activity的启动模式有哪几种,分别用于什么场景?

standard 标准模式

默认模式。每次启动Activity都会创建一个新的实例位于栈顶。谁启动了这个Activity,那么这个Activity就运行在启动它的那个Activity所在的栈中。因ApplicationContext()没有任务栈,所以无法采用标准模式启动Activity。但可通过为待启动的Activity指定标记位:FLAG_ACTIVITY_NEW_TASK,那么在启动时就会为其创建一个新的任务栈(这实际上是采用了singleTask启动模式)。这种模式下,允许有多个相同的实例,也允许多个相同Activity叠加。


singleTop 栈顶复用模式

如果需要新建的Activity位于任务栈栈顶,那么此Activity的实例就不会重建,而是重用栈顶的实例( 调用实例的 onNewIntent() 、不调用onCreate()和onStart())否则就会创建该Activity新的实例,并放入栈顶。
这种模式下可以有多个实例,但是不允许多个相同的Activity叠加。

使用场景:适合接收通知启动的内容显示页面。
例如:某个新闻客户端的新闻内容页面,如果收到10个新闻推送,每次都打开一个新闻内容页面是很烦人的。


singleTask 栈内复用模式

在同一个应用程序中启动它时,若Activity不存在,则会在当前task创建一个新的实例,否则则会把task中在其之上的其他Activity 杀死并调用他的onNewIntent()方法。

使用场景:适合作为程序入口点。
例如:浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。


singleInstance 单例模式

只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。

使用场景:适合需要与程序分离开的页面。多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。
例如:将闹铃提醒与闹铃设置分离。


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

(1)onNewIntent(Intent intent)

当Activity的启动模式设置为singleTop() ,singleTask () ,singleInstance()时,重新启动该Activity时不会调用其onCreate()方法,而是调用onNewIntent(Intent intent)方法通过设置 setIntent(intent)来刷新数据。

(2)onConfigurationChanged(Configuration newConfig)

当系统的配置信息发生改变时,系统会调用此方法。注意,只有在配置文件 AndroidManifest 中处理了 configChanges属性 对应的设备配置,该方法才会被调用。如果发生设备配置与在配置文件中设置的不一致,则Activity会被销毁并使用新的配置重建。

你可以在这里声明activity可以处理的任何配置改变,当这些配置改变时不会重新启动activity,而会调用activity的
onConfigurationChanged(Resources.Configuration)方法。如果改变的配置中包含了你所无法处理的配置(在android:configChanges并未声明),
你的activity仍然要被重新启动,而onConfigurationChanged(Resources.Configuration)将不会被调用。


configChanges设置常用取值:

locale:用户选择一种新的语言
touchscreen:更换手机屏幕.
keyboard:键盘类型发生改变,如更换外置键盘.
keyboardHidden:手机键盘是否可显示被设置,如已使用外置键盘.
navigation:导航系统发生改变.
screenLayout:手机屏幕布局发生改变,如新的屏保被激活.
fontScale:手机字体发生改变.
uiMode:2.2系统之后才出现,如用户把手机放桌子上、车子上或默认模式被启用.
orientation:手机屏幕切换,如横竖屏;如果运行sdk在13及以上,也需要加上screenSize.
screenSize:可用屏幕大小发生改变;sdk在12及以下不需要注意.
smallestScreenSize:手机屏幕发生改变,且不用顾及转屏的问题;如放到一个投影仪查看手机,API13以上添加的属性.
layoutDirection:手机屏幕左右或上下互换,API17以上添加的属性.


注意:横竖屏切换时,如果 targetSdkVersion 的值大于等于13,需要配置

android:configChanges='orientation|screenSize'


才会回调onConfigurationChanged 方法

如果 targetSdkVersion 的值大于等于13,只需配置

android:configChanges='orientation'
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: