对 FLAG_ACTIVITY_NEW_TASK、FLAG_ACTIVITY_CLEAR_TOP、FLAG_ACTIVITY_SINGLE_TOP 的理解

47 篇文章 0 订阅
31 篇文章 0 订阅

为了看得更清晰,以下使用代称
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。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: Android 12 Intent有以下Flag:FLAG_ACTIVITY_NEW_TASK、FLAG_ACTIVITY_CLEAR_TASK、FLAG_ACTIVITY_CLEAR_TOP、FLAG_ACTIVITY_SINGLE_TOP、FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS和FLAG_ACTIVITY_NO_HISTORY。 ### 回答2: Android 12引入了一些新的intent标记(flag),以便开发者可以在应用程序之间进行更好的通信和交互。以下是Android 12中的一些intent标记(flag): 1. FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS( 0x00800000):当启动一个Activity时,可以使用此标记将其排除在最近使用应用程序列表之外。这意味着即使用户最近使用了该应用,也不会在最近使用应用程序列表中显示该Activity。 2. FLAG_ACTIVITY_NEW_TASK( 0x10000000):使用此标记启动一个新的任务(Task)。如果当前没有活动的任务正在运行,它将创建一个新的任务;否则将在已有任务中启动Activity。 3. FLAG_ACTIVITY_CLEAR_TASK(0x00008000):使用此标记启动一个新的Activity时,会清除任务(Task)中所有已存在的Activity,只保留新启动Activity。 4. FLAG_ACTIVITY_TASK_ON_HOME(0x00004000):使用此标记启动一个新的Activity时,如果它已经是该任务的根Activity,则将该任务移动到后台并显示Home屏幕。 5. FLAG_ACTIVITY_FORWARD_RESULT(0x02000000):使用此标记启动一个新的Activity,并将结果返回给启动它的Activity。 6. FLAG_ACTIVITY_NO_ANIMATION(0x00010000):使用此标记启动一个新的Activity时,将禁用转场动画效果。 需要注意的是,这只是Android 12中的一些intent标记(flag),还有其他标记(flag)可以根据开发者的需求来使用。这些标记(flag)的灵活使用可以提供更好的用户体验和应用程序之间的交互功能。 ### 回答3: Android 12中的Intent有很多不同的flag,每个flag都有特定的作用。以下是一些常用的Intent flag: 1. FLAG_ACTIVITY_NEW_TASK: 这个flag用于指定新的Activity位于一个新的任务栈中,而不是当前任务栈。 2. FLAG_ACTIVITY_CLEAR_TOP: 这个flag用于将目标Activity之上的所有Activity都移除栈顶,从而保证目标Activity位于栈顶。 3. FLAG_ACTIVITY_SINGLE_TOP: 这个flag用于指定如果目标Activity已经处于栈顶,则不会创建新的实例,而是调用其onNewIntent()方法。 4. FLAG_ACTIVITY_REORDER_TO_FRONT: 这个flag用于重新调整Activity栈,将目标Activity移到前台。 5. FLAG_ACTIVITY_CLEAR_TASK: 这个flag用于在启动新的Activity时清除所有该任务栈中的其他Activity。 6. FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS: 这个flag用于指定某个Activity不会出现在最近使用的应用列表中。 7. FLAG_ACTIVITY_NO_ANIMATION: 这个flag用于指定启动Activity时不使用任何转场动画效果。 8. FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET: 这个flag用于在任务重置时清除目标Activity之上的所有Activity。 以上是Android 12中一些常见的Intent flag,这些flag可以帮助开发者在启动Activity时指定其行为和特性。根据具体的需求,可以选择适当的flag来达到预期的效果。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值