关于Activity的启动方式

本文总结了Android中Activity的四种启动模式:standard、singleTop、singleTask和singleInstance,详细阐述了每种模式的特点和应用场景,并提及了相关配置属性如clearTaskOnLaunch、finishOnTaskLaunch等对Activity启动的影响。内容基于API 23测试得出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前有读过几篇从源码解析Activity的启动,由于自己并没有仔细看过源码,对于里面的很多判断都没有注意到,后来看Activity的Launchmode的时候,才发现有很多看似不重要的东西被我们忽略了。今天就结合自己的面试经验加博客的浏览,总结一下Activity的启动方式。以下总结是基于api23做的测试。

我们在浏览博客的时候,很轻松的就能搜到一堆的关于launchmode的资料,大体上大家介绍的都差不多,一共四种模式

1. standard 默认的标准模式,其特点是你只要调用startActivity来启动它,他就不停的创建,这里要注意一点,这个模式属于癞皮狗,谁启动它,它就跟谁回家(谁启动它,它就被放到谁的Task栈中)。

2. singleTop 栈顶复用模式,如其名,假如它在栈顶那么就复用它,调用它的onNewIntent方法。但是这里要注意一点,启动它的Activity跟它在同一个Task内,否则和standard模式一样,也会重新创建,并放到启动它的Activity所在的栈。

3. singleTask 栈内复用模式,该模式的特点是,在一个Task里面只有一个该Activity,假如已经启动过该Acitity,当再次启动它时,会将其上面的Activity一一出栈,对于该模式有搭配使用的一个属性TaskAfinity,这个属性只有和SingleTask模式相结合才有意义。SingleTask和TaskAfinity结合可以使该Activity运行在TaskAfinity指定的Task里面。这里注意,该模式的Activity只会存在一个,并且如果没有指定TaskAfinity的话,该Activity创建只会放到自己app对应的task里面。

4. singleInstance 单实例模式,其特点是在系统中只存在该单实例,并且该单实例是被放到一个独立的栈中,这个栈只会放这一个Activity,即使通过该Activity启动的Activity也不会放到该task里面。

除了上面所说的四个启动模式,android中还提供了几个设置项来控制Activity的启动,放在<activity>标签下面:

android:clearTaskOnLaunch 该属性一般用在根Activity,当我们离开该app,再次点击图标进来的时候,会清空根上面的Activity,但是通过最近进来,则不会,对于非根Activity该属性无效。

android:finishOnTaskLaunch 该属性与clearTaskOnLaunch类似,不过该属性是用于销毁自己,而不是其它的Activity。

android:alwaysRetainTaskState 该属性针对clearTaskOnLaunch,表示当进行清空的时候,设置了该属性的Activity所在栈不会被清空。使用api23之后的手机亲测,这个属性并不能保证该task或者该Activity不被出栈。

android:allowTaskReparenting 该属性与singleTask模式相结合,当设置为true时,如果该activity已经被启动,再去点击其所在的app图标,则会直接打开该页面,并将该页面放到自己app所在的task。不过使用api23之后的版本测试,发现只要是singleTask模式,就会将该activity放到自己的栈中,并且当点击图标打开该应用的时候,直接显示该页面,而无需设置该属性,切该属性设置了也无效。

对于在代码里通过设置flag的方式,在此就不做解释了,其效果同上面四种。

参考链接:

https://blog.youkuaiyun.com/javazejian/article/details/52071885









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值