Activity的两种启动模式:FLAG_ACT…

本文详细介绍了Android中Activity的两种启动模式:FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_REORDER_TO_FRONT。通过具体实例展示了如何使用这两种模式来调整应用程序中Activity的堆栈顺序。

Activity的两种启动模式:FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_REORDER_TO_FRONT

 

1. 如果已经启动了四个Activity:A,B,C和D。在D Activity里,我们要跳到B Activity,同时希望C finish掉,可以在startActivity(intent)里的intent里添加flags标记,如下所示:

Java代码   收藏代码
  1. Intent intent new Intent(this, B.class);   
  2. intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
  3. startActivity(intent);  

 

  这样启动B Activity,就会把D,C都finished掉,如果你的B Activity的启动模式是默认的(multiple 则B Activity会finished掉,再启动一个新的Activity B。

  如果不想重新再创建一个新的B Activity,则在上面的代码里再加上:

Java代码  
  1. intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);   

 这样B Activity就不会再创建一个新的了,而是会重用之前的B Activity,同时调用B Activity的onNewIntent()方法。

 

2. 如果已经启动了四个Activity:A,B,C和D,在D Activity里,想再启动一个Actvity B,但不变成A,B,C,D,B,而是希望是A,C,D,B,则可以像下面写代码:

Java代码  
  1. Intent intent new Intent(this, MainActivity.class);  
  2. intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);   
  3. startActivity(intent);  

http://www.cnblogs.com/-OYK/archive/2011/6/30.html

Background activity launch blocked! goo.gle/android-bal [callingPackage: com.google.android.dialer; callingPackageTargetSdk: 35; callingUid: 10135; callingPid: -1; appSwitchState: 2; callingUidHasVisibleActivity: false; callingUidHasNonAppVisibleWindow: false; callingUidProcState: FOREGROUND_SERVICE; isCallingUidPersistentSystemProcess: false; allowBalExemptionForSystemProcess: true; intent: Intent { act=com.android.dialer.incall.statusbarnotification.buttonintentANSWER flg=0x10040000 xflg=0x4 cmp=com.google.android.dialer/com.android.dialer.incall.activity.ui.InCallActivity (has extras) }; callerApp: null; balAllowedByPiCreator: BSP.NONE; resultIfPiCreatorAllowsBal: BAL_ALLOW_SAW_PERMISSION; callerStartMode: MODE_BACKGROUND_ACTIVITY_START_SYSTEM_DEFINED; hasRealCaller: true; isCallForResult: false; isPendingIntent: true; autoOptInReason: null; realCallingPackage: com.android.systemui; realCallingPackageTargetSdk: 36; realCallingUid: 10087; realCallingPid: 1612; realCallingUidHasVisibleActivity: false; realCallingUidHasNonAppVisibleWindow: true; realCallingUidProcState: PERSISTENT; isRealCallingUidPersistentSystemProcess: true; originatingPendingIntent: PendingIntentRecord{4ea7d9 com.google.android.dialer startActivity (allowlist: 5e9a714:+30s0ms/0/NOTIFICATION_SERVICE/NotificationManagerService)}; realCallerApp: ProcessRecord{864d437 1612:com.android.systemui/u0a87}; realInVisibleTask: false; balAllowedByPiSender: BSP.ALLOW_FGS; resultIfPiSenderAllowsBal: BAL_ALLOW_NON_APP_VISIBLE_WINDOW; realCallerStartMode: MODE_BACKGROUND_ACTIVITY_START_SYSTEM_DEFINED; balRequireOptInByPendingIntentCreator: true; balDontBringExistingBackgroundTaskStackToFg: true]
最新发布
09-11
<think> 我们正在讨论的是Android中Activity的启动标志(Flags),而不是之前构建系统的lunch模式。用户要求解释各个启动模式,如FLAG_ACTIVITY_REORDER_TO_FRONT等。根据提供的引用,我们将重点解释几个常见的启动标志。 引用中提到了FLAG_ACTIVITY_REORDER_TO_FRONT, FLAG_ACTIVITY_CLEAR_TOP, 以及FLAG_ACTIVITY_BROUGHT_TO_FRONT。此外,我们还可以补充其他的标准启动标志(如FLAG_ACTIVITY_NEW_TASK等),但用户主要提到了REORDER_TO_FRONT,所以我们先围绕这个展开,然后根据引用内容进行扩展。 注意:用户提供的引用内容主要涉及以下标志: [^1]: FLAG_ACTIVITY_REORDER_TO_FRONT: 如果activity已经在任务栈中,则将它移到栈顶,而不创建新的实例。 [^2]: FLAG_ACTIVITY_BROUGHT_TO_FRONT: 这个标志通常由系统使用,而不是由应用程序代码使用。它表示Activity被带到前台是因为它的任务栈被带到了前台。引用中提到了它与REORDER_TO_FRONT的区别,但注意该标志通常不由开发者直接设置。 [^3]: 使用FLAG_ACTIVITY_REORDER_TO_FRONT时可能遇到的ANR问题(在返回键处理时)。 [^4]和[^5]: FLAG_ACTIVITY_CLEAR_TOP: 如果目标Activity已经在任务栈中,则清除该Activity上面的所有Activity,使目标Activity成为栈顶。如果目标Activity启动模式是默认(standard),则目标Activity会被销毁并重新创建(因为需要新的实例),除非同时设置FLAG_ACTIVITY_SINGLE_TOP。 因此,我们将详细解释以下标志: 1. FLAG_ACTIVITY_REORDER_TO_FRONT 2. FLAG_ACTIVITY_CLEAR_TOP 3. 补充其他常见标志(如FLAG_ACTIVITY_NEW_TASK, FLAG_ACTIVITY_SINGLE_TOP)以便全面性。 结构如下: 每个标志分为:定义、行为、使用场景和注意事项。 注意:引用中提到的FLAG_ACTIVITY_BROUGHT_TO_FRONT我们只做简单说明,因为它通常由系统使用。 同时,在注意事项中,我们将提及引用[3]中提到的ANR问题(即使用FLAG_ACTIVITY_REORDER_TO_FRONT后按返回键可能卡死的问题)及其解决方案。 我们按照以下结构回答: ### 1. FLAG_ACTIVITY_REORDER_TO_FRONT ### 2. FLAG_ACTIVITY_CLEAR_TOP ### 3. FLAG_ACTIVITY_NEW_TASK ### 4. FLAG_ACTIVITY_SINGLE_TOP ### 5. FLAG_ACTIVITY_BROUGHT_TO_FRONT(简要) 最后,生成相关问题。 注意:所有数学表达式(如果有)按照要求格式书写(虽然本题可能没有数学表达式,但如果有变量等,使用$...$)。 </think> ### Android Activity启动标志详解 在Android开发中,Activity启动标志用于控制任务栈行为和页面导航逻辑。以下是关键标志的详细解释: #### 1. **FLAG_ACTIVITY_REORDER_TO_FRONT** - **行为**:当目标Activity已在任务栈中存在时,将其移至栈顶而不创建新实例;若不存在则新建实例 - **任务栈变化**:假设栈顺序:A→B→C→D `从D启动B` → 新顺序:A→C→D→B(B被提到栈顶)[^1] - **适用场景**:快速切换到已打开的页面(如从详情页返回列表页) - **注意事项**: - 可能导致返回键异常(ANR),需在`onBackPressed()`中显式finish[^3] - 与`FLAG_ACTIVITY_BROUGHT_TO_FRONT`区别:后者由系统自动设置,开发者不应主动使用[^2] #### 2. **FLAG_ACTIVITY_CLEAR_TOP** - **行为**:清除目标Activity之上的所有Activity,使其成为栈顶 - **任务栈变化**:假设栈顺序:A→B→C→D `从D启动B` → 新顺序:A→B(C/D被销毁)[^4] - **特殊处理**: - 若同时设置`FLAG_ACTIVITY_SINGLE_TOP`:直接复用B实例 - 未设置`SINGLE_TOP`:销毁原B实例并创建新实例[^5] - **适用场景**:退出多层页面返回主页(如支付流程完成返回首页) #### 3. **FLAG_ACTIVITY_NEW_TASK** - **行为**:在新任务栈中启动Activity(独立于当前栈) - **关键规则**: - 适用于非Activity上下文启动(如Service/广播) - 配合`taskAffinity`属性指定新栈名称 - **适用场景**:从通知栏启动独立流程(如聊天消息跳转) #### 4. **FLAG_ACTIVITY_SINGLE_TOP** - **行为**:若目标Activity已在栈顶,则触发`onNewIntent()`而非创建新实例 - **匹配声明**:等价于manifest设置`launchMode="singleTop"` - **适用场景**:避免重复创建相同页面(如多次点击通知) #### 5. **组合标志示例** ```java // 清除栈顶并复用主页实例 Intent intent = new Intent(this, MainActivity.class); intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP); startActivity(intent); ``` #### 调试建议 使用`adb shell dumpsys activity`命令实时观察任务栈变化,验证标志行为是否符合预期。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值