Activity的四种启动模式

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'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值