Android: "singleTask"启动模式的行为与描述不符?

8
我一直在学习Android,遇到了一个与launchMode="singleTask"相关的问题。文档中指出,当使用此属性时,Activity始终会作为根Activity启动到新任务中。其次,文档中还指出,如果有其他Activity在它的任务堆栈上方时,针对这样的Activity的Intent将被丢弃(尽管任务仍将被带到前台)。
我已经尝试过这个功能,观察到的行为完全不同。具体来说: - launchMode="singleTask"的Activity并不总是任务堆栈中的根Activity。它们只是放置在具有相同亲和性的现有堆栈顶部。 - 当针对这样的Activity定向Intent时,如果堆栈中存在其他Activity,则不会丢弃Intent。相反,堆栈上方的Activity将被丢弃。然后,Intent将像往常一样通过onNewIntent传递给Activity。
可以有人确认这是实际的行为吗?如果是这样,为什么文档是错误的?如果不是,那我做错了什么. . .
编辑: 可以在这里找到演示此行为的示例: http://groups.google.co.uk/group/android-developers/browse_thread/thread/fd8f249803b4688a# 很抱歉跨帖,但我无法获得一个适合在这里发布的示例格式...

我可以确认这种行为,但我也不理解它。子活动被销毁了。 - Jeffrey Blattman
3个回答

8
这是一个关于taskAffinity的问题。当您启动一个活动时,Android会检查您想要启动的活动的taskAffinity。如果它与任务中根活动的taskAffinity相同,则会忽略launchMode =“singleInstance”launchMode=“singleTask”(因为这些启动模式需要创建一个新任务来启动活动),并在当前任务中启动活动。

不幸的是,这没有很好地记录下来,但是taskAffinitylaunchMode具有更高的优先级。

如果您真的想要使用singleTasksingleInstance活动(通常不是正确的做法,因为它会带来许多其他令人讨厌的事情,而您可能会弄错),则需要确保您的singleInstancesingleTask活动在其<activity>定义中拥有以下内容:

android:taskAffinity=""

3

文档显示:

FLAG_ACTIVITY_NEW_TASK ... 与“singleTask”launchMode产生相同的行为...

使用Intent(FLAG_ACTIVITY_NEW_TASK)启动活动取决于活动亲和性

如果已经存在与新活动具有相同亲和性的任务,则将活动启动到该任务中。如果没有,则开始一个新任务。

因此,对于singleTask launchMode也必须进行相等的亲和性检查。


我认为它们两者不会产生“相同”的行为。假设亲和力是正确的,singleTask也会尝试清除任务活动,除了根活动。 - stdout

0

我可以为这个模式添加一些奇怪行为的经验。也许这个问题的答案对我也有帮助。

我想给我的第一个屏幕添加一个位置选择搜索。我想把查询结果传回到我的第一个Activity。那个Activity是搜索调用和接收查询的。然而,"singleTask"破坏了我的计划 ;(

具有查询的搜索意图从未达到我的第一个Activity。相反,"android.intent.action.MAIN"达到了我的第一个Activity。当移除"singleTask"时,搜索意图成功传递。但这样我就创建了几个我的主屏幕实例。

<activity
  android:label="@string/app_name"
  android:name="ActivityStart"
  android:screenOrientation="portrait"
  android:launchMode="singleTask">
  <intent-filter>
  <action
      android:name="android.intent.action.SEARCH" />
    <action
      android:name="android.intent.action.MAIN" />
    <category
      android:name="android.intent.category.LAUNCHER" />

  </intent-filter>
  <meta-data
    android:name="android.app.searchable"
    android:resource="@xml/searchable" />

</activity>

现在我使用TextView代替...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接