Activity之启动模式

本文深入解析了Android中Activity的四种启动模式:standard、singleTop、singleTask和singleInstance的使用场景与具体行为,包括不同模式下Activity的生命周期变化,以及在多模式混搭情况下的表现。

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

1、Activity的几种LaunchMode及使用场景
standard 模式
这是默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中。使用场景:大多数Activity。

  • singleTop 模式

如果在任务的栈顶正好存在该Activity的实例,就重用该实例( 会调用实例的 onNewIntent() ),否则就会创建新的实例并放入栈顶,即使栈中已经存在该Activity的实例,只要不在栈顶,都会创建新的实例。使用场景如新闻类或者阅读类App的内容页面。

  • singleTask 模式

如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的 onNewIntent() )。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移出栈。如果栈中不存在该实例,将会创建新的实例放入栈中。使用场景如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。

  • singleInstance 模式

在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例( 会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。使用场景如闹铃提醒,将闹铃提醒与闹铃设置分离。singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题,比如:A -> B (singleInstance) -> C,完全退出后,在此启动,首先打开的是B。

===============================================================================

LaunchMode
(注意:以下测试截图和关系等,都是在未杀进程下进行)

  • standard 模式

1、在Activity启动模式默认的情况下,新建3个Activity,Test1、Test2、Test3。
(1)进入栈:关系为Test1–>Test2–>Test3–>Test2
activity栈如下:
在这里插入图片描述
生命周期如下:
在这里插入图片描述
(2)回退栈 关系为Test1–>Test2–>Test1
在这里插入图片描述
然后activity栈会移除。
(3)总结:
可以看到进栈时onStop是在下一个activity的onResume创建之后,
出栈时onStop和onDestory在下一个activity的onResume之后

  • singleTop 模式

1、只修改Test2的启动模式为singleTop
关系为Test1–>Test2–>Test3–>Test2
activity栈和生命周期等同于standard 模式

2、只修改Test2的启动模式为singleTop
关系为Test1–>Test2–>Test3–>Test3
activity栈如下:
在这里插入图片描述
发现当前Test3只创建了一次,即任务的栈顶正好存在该Activity的实例,就重用该实例

生命周期如下:
在这里插入图片描述
当启动模式为singletop时,如果栈顶存在该Activity实例就重用,但是不在走onCreate和onStart,走onNewIntent

3、修改Test1、Test2、Test3启动模式都为singletop
关系为Test1–>Test2–>Test3–>Test1
(1)当正常跳转,activity栈和生命周期都如standard 模式。
(2)当在Test1页面按Home键退出,然后再点击app图标进入,生命周期发生变化,如下:
onNewIntent --> onRestart–> onStart–> onResume
(3)当在Test2和Test3页面按Home键退出,然后再点击app图标进入,生命周期如下:
onRestart–> onStart–> onResume
(注意:standard 模式的生命周期为 onRestart–> onStart–> onResume)

4、总结只有当栈顶有该activity实例,继续跳转该activity时才有效,activity栈才不会新增。并且会走onNewIntent和onResume。回退栈跟standard 模式并无差别。(如果该activity跳转到另一个activity,再跳转回来时不会走onNewIntent)

  • singleTask 模式

1、只修改Test1的启动模式为singleTask
(1)从进入activity --> Home键退出 -->手动点击再次进入。生命周期如下:
在这里插入图片描述
可以看出再次进入时会走onNewIntent和onRestart,普通模式只有onRestart
(因为test1为启动activity)
2、修改Test2的启动模式为singleTask,test1和test3的启动模式为standard
关系为:test1 --> test2 --> test3 --> test2
(1)当test1 --> test2 --> test3时,堆栈关系如下:
在这里插入图片描述

(2)当test3再次跳转到test2
在这里插入图片描述
(3)最终的生命周期如下:
在这里插入图片描述
可以看见,当test3跳转到test2时,因为当前是singletask模式,会把它上面的栈的实例都会移除。
都为普通模式当前栈:test1–>test2–>test3–>test2。所有移除上面的栈后只剩下test1–>test2。

  • singleInstance 模式

1、只修改Test1的启动模式为singlestance
(1)从进入activity --> Home键退出 -->手动点击再次进入。生命周期如下:
在这里插入图片描述
可以看出再次进入时会走onNewIntent和onRestart,普通模式只有onRestart,跟singletask一致

2、修改Test2的启动模式为singleInstance ,test1和test3的启动模式为standard
关系为:test1 --> test2 --> test3 --> test2
(1)当test1 --> test2 --> test3时,堆栈关系如下:
在这里插入图片描述
即test2是一个单独分配空间,跟test1和test3不在一起。并且test2在下面。
(2)当test3–>test2时
在这里插入图片描述
test2在上面,test1和test3分配的栈在下面。

这时的完整生命周期为:
在这里插入图片描述

多混搭模式测试
1、test1为standard、test2为singleInstance、test3为singleTask
(1)当test1 --> test2时,在test2页面按Home键退出,然后再点击图标进入
------发现惊喜---------
生命周期如下:
在这里插入图片描述
在test2页面时,test1的生命状态为onStop,此时按Home键退出test2也会进入onStop状态。但是点击app进入时,出现的是test1的页面。(很奇怪~)

test1–>test2时的堆栈:
在这里插入图片描述
test2–>按home退出–>app再次进入堆栈

在这里插入图片描述
(2)当test1 --> test2 -->test3,在test3按Home键退出,点击app再次进入不会走onNewIntent。
只有重用该Activity实例时才会走onNewIntent。即test3–>test2–>test3
(3)test1–>test2–>test3时,一直按返回键回退,正常回退

2、test1为standard、test2为singleInstance、test3为singleInstance
关系为test1 --> test2 -->test3
在这里插入图片描述

不要以为test2和test3分配到同一个空间了,singleinstance单例都是独立的。
所以按Home键退出后,再次进入会进入Test1页面

3、test1为singleInstance、test2为singleInstance、test3为singleInstance
(1)当test1–>test2或test1–>test2–>test3时,按home键退出再进来显示test1页面,然后点击回退键时,直接退出到桌面。
堆栈如下:
test1–>test2–>test3
在这里插入图片描述
test3–>点击home
在这里插入图片描述
点击app进入
在这里插入图片描述
test2和test3实例还在,但是堆栈在系统桌面之下,所有test1回退之后会回到系统桌面。
(2)test1–>test2–>test3时,一直按返回键回退,正常回退

3、test1为singleIntask、test2为singleIntop、test3为singleIntop
(1)当test1–>test2或test1–>test2–>test3时,按home键退出,再进来时:
当前堆栈只剩test1,test2和test3消失
在这里插入图片描述
这时候按返回键退出,test1堆栈消失
在这里插入图片描述
(2)test1–>test2–>test3时,一直按返回键回退,正常回退
(3)test1–>test2–>test3–>test1时,会把test2、test3给移除掉

onNewIntent
1、哪些情况会导致出现onNewIntent
(1)在启动模式为singletop时,只有启动界面Activity在按Home退出再回到该启动界面时,会进入
(2)所有Activity启动模式为singletask时,只有Activity在按Home退出再回到该启动界面时,会进入
(3)当启动界面activity的启动模式为singleInstance时,无论其他的Activity启动模式是什么,按home退出再进入时,会出现并且会回到启动activity
(4)当启动模式为singletop、singletask、singleInstance时,当前activity已经在栈顶再次启动该activity时,会出现

2、容易误解以为会出现onNewIntent
(1)无论哪种模式,锁屏再恢复锁屏都不会进入
(2)无论哪种模式,按返回键都不会进入
(3)连续启动singletask时,并且启动界面启动模式为默认或singletop时,不会进入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值