Activiity的四种启动方式(launchMode)

本文详细介绍了Android中Activity的四种启动模式:standard、singleTop、singleTask和singleInstance,包括它们的特点、应用场景及如何在代码中实现这些启动模式。

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

这个知识估计快被人写烂了,但是为了自己印象深刻,我还是要自己写一次。>.<

注:文中cls都是Activity的class对象

1.standard

系统默认的启动方式,每次启都会创建一个新的Activity实例,一个任务栈允许多个该Activity实例存在,被启动的Activity自动放入启动它的Activity的任务栈,比如任务栈1中Activity A启动了Activity B,则B自动放入任务栈1

AndroidManifest.xml

<activity
android:launchMode="standard"/>
复制代码

Java代码

context是Activity实例

Intent intent = new Intent(context,  cls);
context.startActivity(intent);
复制代码

context不是Activity实例 注意:该Activity的taskAffinity必须为默认值或者不设置

Intent intent = new Intent(context,  cls);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
复制代码

2.singleTop

该启动方式下,如此该Activity的没有实例在任务栈,则创建一个实例放入栈顶;如果有实例在任务栈,但不在栈顶,则再创建一个实例放入栈顶;如果有实例在任务栈,且在栈顶,则不再创建实例。

任务栈1有A、B、C三个Activity,如果从栈底到栈顶的顺序为[A,B,C],singleTop方式启动C,则不再创建C的实例;如果从栈底到栈顶的顺序为如果从栈底到栈顶的顺序为[A,C,B],启动C,则重新创建一个C的实例,并放入栈顶[A,C,B,C]。

AndroidManifest.xml

<activity
android:launchMode="singleTop"/>
复制代码

Java代码

context是Activity实例

Intent intent = new Intent(context,  cls);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
context.startActivity(intent);
复制代码

context不是Activity实例

Intent intent = new Intent(context,  cls);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
context.startActivity(intent);
复制代码

3.singleTask

这是一种Activity的栈内单例模式,即只要该Activity所在任务栈有一个实例存在,启动它的时候都不会再次创建。启动这个Activity的时候,如果它的任务栈里没有这个Activity的实例存在,就会创建一个实例并压入它的任务栈顶;如果它的任务栈已经存在这个Activity的实例,就会清空这个任务栈所有在该Activity前面的Activity。

任务栈1有从栈底到栈顶的顺序为**[A,B,C],singleTask方式启动D,则创建D实例,放入任务栈1[A,B,C、D]任务栈1有从栈底到栈顶的顺序为[A,B,C]singleTask方式启动B,则不创建A实例,清空A上的所有Activity,任务栈变为[A,B]**。

AndroidManifest.xml

<activity
android:launchMode="singleTask"/>
复制代码

Java代码

context是Activity实例

Intent intent = new Intent(context,  cls);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);
复制代码

context不是Activity实例

Intent intent = new Intent(context,  cls);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);
复制代码

4.singleInstance

这是一种Activity的单例模式,拥有singleTask的所有特性,并且这种启动方式启动的Activity,系统会为它创建一个独立的任务栈,这个任务栈只允许该Activity存在。

这里特别说明下这种情况回退栈,三种状态对应的回退栈是:
橘色的是任务栈1的Activity,蓝色是任务栈2的Activity,可以看出开始回退栈是[A,B,C],也就是按返回键退出的顺序依次是C、B、A;启动D,D在前台,ABC 在后台,回退栈是[A,B,C,D];启动E,E属于任务栈1,E在前台,任务栈1也就在前台,同任务栈的A、B、C的回退栈顺序也就跟着提到了D之前,回退栈顺序也就变成了[D,A,B,C,E],按返回键退出Activity的顺序也就变成了E,C,B,A,D。

AndroidManifest.xml

<activity
android:launchMode="singleInstance"/>
复制代码

Java代码

context是Activity实例

没找到
复制代码

context不是Activity实例

没找到
复制代码

另:onNewIntent(Intent intent)

该方法跟启动方式有关,当Activity的启动方式是singleTop、singleTask或者singleInstance时,如果不需要重创建实例,则调用已存在实例的onNewIntent(Intent intent) ,新的Intent传入onNewIntent(Intent intent)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值