启动模式"singleTask"和FLAG_ACTIVITY_NEW_TASK具有不同的行为!

官方文档task and back stack一文,地址:http://developer.android.com/guide/topics/fundamentals/tasks-and-back-stack.html

提到定义启动模式有两种方法,一个是在manifest文件中定义,另一个用intent设置flag。

前一种方法有android的四大启动模式,其中就有“singleTask”:以此种模式启动的activity例如activityA会在一个新task栈中的根部启动,而且此栈可以加入新的activity。当在其他activity中要启动activityA时,如果有activityA实例存在,就会把其抬到前台而不去启动新的activityA。


后一种方法有好多flag,其中文档中说与“singleTask”行为相似的是FLAG_ACTIVITY_NEW_TASK:

FLAG_ACTIVITY_NEW_TASK
Start the activity in a new task. If a task is already running for the activity you are now starting, that task is brought to the foreground with its last state restored and the activity receives the new intent in  onNewIntent().

This produces the same behavior as the "singleTask" launchMode value, discussed in the previous section.

但事实是这样的吗?

我实验了一天,结论如下:

一、实验中“singleTask”的行为:有如下几个activity A、B、C,B的启动模式是singleTask,A启动B,B启动C,C再启动B。

结果是C被销毁掉,B到前台。此时剩下两个activity,A和B。用adb shell dumpsys activity来看,

      Run #3: HistoryRecord{406954f0 com.linc.TestBackStack/.ActivityB}
      Run #2: HistoryRecord{4065f880 com.linc.TestBackStack/.ActivityA}

二、实验中FLAG_ACTIVITY_NEW_TASK的行为(环境同上):

A中启动B,intent设置flag FLAG_ACTIVITY_NEW_TASK,B启动C,C再启动B。

B被抬到前台,而没有发现C被销毁。

用adb shell dumpsys activity来看,

      Run #5: HistoryRecord{407c28c8 com.linc.TestBackStack/.ActivityB}
      Run #4: HistoryRecord{406c0b48 com.linc.TestBackStack/.ActivityC}
      Run #3: HistoryRecord{406ec298 com.linc.TestBackStack/.ActivityB}
      Run #2: HistoryRecord{406cedb8 com.linc.TestBackStack/.ActivityA}

用BACK键可以从B退到C,再次按BACK键,没有反应,无响应。


出现这种情况,文档描述和实际不符,二中的B有两个?是dumpsys出了问题?

不知哪位高人能给予解释。

调查还在继续。。。


  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
`intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)` 是用于设置 Intent 的标志,指示在启动活动时创建一个新的任务。 通过设置该标志,您可以在一个新的任务中启动活动,而不是将其添加到当前任务的堆栈中。这意味着新活动将在一个新的任务栈中打开,并成为该任务的根活动。 这种情况通常发生在以下情况下: 1. 在非活动上下文中启动活动:例如,在服务、广播接收器或应用程序的后台任务中启动活动时,由于缺乏 UI 上下文,您需要设置 `FLAG_ACTIVITY_NEW_TASK` 标志来创建一个新的任务,以便启动活动。 2. 启动独立的任务:有时,您可能希望将某个活动作为一个单独的任务打开,而不是与当前应用程序的任务关联。通过设置 `FLAG_ACTIVITY_NEW_TASK` 标志,您可以实现这一点。 下面是一个示例代码片段,演示如何使用 `intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)` 启动一个新的任务: ```java Intent intent = new Intent(context, YourActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); ``` 在此示例中,我们创建了一个 Intent 对象,指定目标活动为 `YourActivity`。然后,我们使用 `setFlags()` 方法设置 `FLAG_ACTIVITY_NEW_TASK` 标志。最后,我们使用 `startActivity()` 方法启动活动。 请注意,使用 `FLAG_ACTIVITY_NEW_TASK` 标志启动活动时,您需要确保目标活动在 AndroidManifest.xml 文件中被声明为具有 `android:launchMode="standard"` 或 `android:launchMode="singleTask"` 属性,以便正确处理任务和活动的创建和销毁。 如果您有其他问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值