对 FLAG_ACTIVITY_NEW_TASK、FLAG_ACTIVITY_CLEAR_TOP、FLAG_ACTIVITY_SINGLE_TOP 的理解

为了看得更清晰,以下使用代称
newtask:FLAG_ACTIVITY_NEW_TASK
cleartop:FLAG_ACTIVITY_CLEAR_TOP
singletop:FLAG_ACTIVITY_SINGLE_TOP

一、default

1.1 default

默认情况下(即没有 newtask flag),启动一个 Activity 时,被启动的 Activity 会在启动它的 Activity 的栈中创建(不管它们 taskAffinity 是否一样)。

如 A 启动 B,B 会在 A 的栈中被创建。

1.2 单独 singletop

activity 在前台(当前显示的栈的栈顶),不创建,它自己 onNewIntent 被调用
activity 不在前台,创建

1.3 单独 cleartop

activity 在启动它的栈里存在,它上面的 activity 会出栈,它自己 finish 后重建
activity 在启动它的栈里不存在,在启动它的栈里创建

1.4 cleartop + singletop

activity 在前台(当前显示的栈的栈顶),不创建,它自己 onNewIntent 被调用
activity 不在前台

  • activity 在启动它的栈里存在,它上面的 activity 会出栈,它自己 onNewIntent 被调用
  • activity 在启动它的栈里不存在,在启动它的栈里创建

二、newtask

加上 newtask flag 后,启动一个 Activity 时,如果需要创建,被启动的 Activity 会在它需要的栈中创建。
如 A 启动 B,B 会在 B 自己需要的栈中被创建(即 taskAffinity 指定的栈)。

2.1 单独 newtask

activity 需要的栈存在,在该栈中创建一个 activity 或将该栈移至前台
activity 需要的栈不存在,创建一个它需要的栈,再创建 activity
(activity 可能创建也可能不创建,如果创建,一定是在需要的栈里)

2.2 newtask + singletop

singeltop > newtask,先走 singletop

activity 在前台(当前显示的栈的栈顶),不创建,它自己 onNewIntent 被调用
activity 不在前台

  • activity 需要的栈存在,在该栈中创建一个 activity 或将该栈移至前台(它自己 onNewIntent 被调用)
  • activity 需要的栈不存在,创建一个它需要的栈,再创建 activity

2.3 newtask + cleartop

activity 在它需要的栈里存在,它上面的 activity 会出栈,它自己 finish 后重建
activity 在它需要的栈里不存在,在它需要的栈里创建

2.4 newtask + cleartop + singletop

singeltop > newtask、cleartop,先走 singletop

activity 在前台(当前显示的栈的栈顶),不创建,它自己 onNewIntent 被调用
activity 不在前台

  • activity 在它需要的栈里存在,它上面的 activity 会出栈,它自己 onNewIntent 被调用
  • activity 在它需要的栈里不存在,在它需要的栈里创建

这就相当与 singleTask 启动模式,具体的处理逻辑可在 ActivityStarter 中查看。

三、其他

其他一些注意点。
一个栈的栈底 activity 总是由 newtask 启动。
singleInstance 并没有自己特殊的 taskAffinity。

<think>好的,用户想了解LAUNCH_SINGLE_INSTANCE的定义、用法和示例。首先,我需要确认这个术语的具体上下文,因为在不同的系统中可能有不同的含义。不过根据提供的参考引用,尤其是引用[3]提到启动模式flag,这应该是在Android开发中的概念。 LAUNCH_SINGLE_INSTANCE是Android中的启动模式之一。AndroidActivity启动模式有四种:standard、singleTopsingleTasksingleInstance。用户提到的LAUNCH_SINGLE_INSTANCE可能对应的是singleInstance模式。需要确认是否正确,因为有时候可能有拼写或术语的差异。例如,文档中通常使用singleInstance,而不是LAUNCH_SINGLE_INSTANCE,但可能在某些上下文中这样称呼。 接下来,查阅Android官方文档,确认启动模式的定义。singleInstance模式确保一个任务中只存在该Activity的一个实例,并且这个实例独自占用一个任务栈。其他Activity启动时会放入其他任务栈中。这与用户提供的引用[3]中的内容相关,该引用提到了通过xml属性或代码设置flag来指定启动模式。例如,使用Intent.FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TASK的组合,但需要结合具体情况。 然后,整理定义部分:LAUNCH_SINGLE_INSTANCE(即singleInstance)的定义是确保Activity全局唯一实例,独占任务栈。适用于需要隔离的界面,比如拨号应用,防止多个实例导致状态混乱。 关于用法,用户可以通过AndroidManifest.xml中的launchMode属性设置,或者在代码中设置Intent的flags。例如,在xml中使用android:launchMode="singleInstance",或者在代码中添加FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_SINGLE_TOPflags。需要确认正确的flags组合,因为有些flags需要配合使用。例如,引用[1]提到FLAG_ACTIVITY_CLEAR_TASK必须配合FLAG_ACTIVITY_NEW_TASK使用。 示例部分需要给出具体的代码和配置示例。例如,在AndroidManifest中声明Activity的launchMode,或者在启动Activity时设置相应的flags。同时,说明使用场景,比如当需要确保某个Activity只有一个实例,或者作为其他应用的入口点时。 最后,生成相关问题,帮助用户进一步理解,比如与其他启动模式的区别、优缺点、实际应用案例等。 需要确保回答准确,引用正确的文档和用户提供的参考。可能需要注意用户提供的引用中有关于FLAG_ACTIVITY_CLEAR_TASK和intra_process_demo的例子,但这些可能与当前问题关联不大,但引用[3]直接相关,需要正确关联。</think>### LAUNCH_SINGLE_INSTANCE 的定义与用法 #### 定义 `LAUNCH_SINGLE_INSTANCE` 是 AndroidActivity 的一种启动模式(对应标准术语 `singleInstance`),用于确保系统中**仅存在该 Activity 的单个实例**,且该实例独占一个独立的任务栈(Task Stack)。其他 Activity 若需要启动,则会被分配到其他任务栈中[^3]。 #### 核心特性 1. **全局唯一性**:同一时刻系统中只会存在该 Activity 的一个实例。 2. **独立任务栈**:该 Activity 独占一个任务栈,其他 Activity 无法进入此栈。 3. **跨应用复用**:若其他应用尝试启动该 Activity,会直接复用已有实例。 #### 用法 1. **XML 声明**(推荐方式): ```xml <activity android:name=".SingleInstanceActivity" android:launchMode="singleInstance" /> ``` 2. **代码动态设置**: ```java Intent intent = new Intent(this, SingleInstanceActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(intent); ``` > 注:某些场景需配合 `FLAG_ACTIVITY_CLEAR_TASK` 清空栈内其他 Activity[^1]。 #### 示例场景 - **拨号界面**:确保全局仅一个拨号界面实例,避免多次拨号导致状态混乱。 - **全局悬浮窗控制**:用于管理全局悬浮窗的 Activity 需要独立存在。 - **跨应用入口**:如支付 SDK 的收银台页面,需独立于调用方的任务栈。 ```java // 示例:启动独立实例的 Activity public void openSingleInstanceActivity(View view) { Intent intent = new Intent(this, PaymentActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值