对 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: flag_activity_clear_task是一个Activity启动模式,它可以清除任务栈中的所有Activity,使得新启动Activity成为任务栈中的唯一Activity。这个标志通常用于启动应用程序的主Activity,以确保用户按下返回键时不会返回到之前的Activity。 ### 回答2: flag_activity_clear_taskAndroid中的一个标志位,用于启动一个新的Activity时清除Activity堆栈中的所有Activity。 在Android中,每个Activity都会被放置在一个堆栈中,当我们启动新的Activity时,原有的Activity会被保留在堆栈中。当我们按下返回键时,系统会按照堆栈的顺序依次销毁并恢复Activity。 但是在某些情况下,我们可能需要启动一个新的Activity后,清除掉之前所有的Activity,使得用户无法通过返回键回到之前的页面。这时就可以使用flag_activity_clear_task标志位。 当我们使用flag_activity_clear_task标志位启动一个新的Activity时,系统会销毁掉Activity堆栈中的所有Activity,并在堆栈中放置新的Activity,使之成为栈底的Activity。 这种使用场景通常发生在登录功能中。当用户成功登录后,我们需要清除掉登录之前的Activity堆栈,以防止用户通过返回键回到未登录的页面。 我们可以在启动Activity时使用Intent的setFlags方法设置flag_activity_clear_task标志位,示例代码如下: ``` Intent intent = new Intent(this, NewActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); ``` 总之,flag_activity_clear_task是一个非常有用的标志位,可以让我们在需要的时候清空Activity堆栈,并启动一个新的Activity。这样可以提供更好的用户体验,同时满足特定功能需求。 ### 回答3: 在Android中,flag_activity_clear_task是一个用于Intent的标志位。当我们在启动一个Activity时,可以通过在Intent中设置该标志位来实现一些特定的行为。 使用flag_activity_clear_task标志位,可以实现以下效果: 1. 清除任务栈:当我们使用该标志位启动一个Activity时,系统会先清空任务栈中的所有Activity,然后再启动指定的Activity。这意味着在新的Activity启动后,之前在任务栈中的所有Activity都会被销毁,任务栈重新变为空白状态。 2. 单一实例:如果我们在Manifest文件中设置了一个Activity的launchMode为singleTask,并且在启动Activity时使用了flag_activity_clear_task标志位,那么系统会先清空任务栈中的所有Activity,然后再创建一个新的实例来启动Activity。这样可以确保该Activity在任务栈中只存在一个实例。 总之,flag_activity_clear_task标志位可以用于清除任务栈中的Activity,重新创建一个新的任务栈,或者确保某个Activity在任务栈中只有一个实例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值