Android:launchMode =“singleTask”的行为与描述不一样?

时间:2010-09-10 22:42:22

标签: android

我一直在学习Android,并遇到了launchMode =“singleTask”的问题。该文档指出,当使用此属性时,活动始终作为根活动启动到新任务中。其次,文档说明如果Intent在其任务堆栈中位于其上方的活动时针对此类Activity,则会丢弃此类Intent(尽管该任务仍然被带到前台)。

我一直在玩这个,我观察到的行为完全不同。特别是: - launchMode =“singleTask”的活动并不总是任务堆栈中的根活动。它们只是在具有相同亲和力的现有堆栈的顶部。 - 当Intent以此类Activity为目标并且堆栈中有其他活动时,不会丢弃Intent。而是丢弃堆栈中它上面的活动。然后,Intent通过onNewIntent正常传递给Activity。

有人可以确认这是实际行为吗?如果是这样,为什么文件不正确?如果不是我做错了什么。 。

编辑:

可以在此处找到演示此行为的示例: http://groups.google.co.uk/group/android-developers/browse_thread/thread/fd8f249803b4688a# 很抱歉这个交叉发布,但是我无法以合适的格式得到这个例子来发布这里......

3 个答案:

答案 0 :(得分:6)

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

不幸的是,这没有详细记录,但taskAffinity优先于launchMode

如果你真的想要一个singleTasksingleInstance活动(这通常不是正确的事情,因为它带来了一大堆其他令人讨厌的东西,你可能会出错) ,然后您需要确保您的singleInstancesingleTask活动在其<activity>定义中的清单中包含以下内容:

android:taskAffinity=""

答案 1 :(得分:3)

Documentation说:

  

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

如何使用Intent启动活动(FLAG_ACTIVITY_NEW_TASK)depends on activity affinity

  

如果已有的任务与新的具有相同的亲和力   活动,活动将启动到该任务中。如果没有,它开始了   新任务。

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

答案 2 :(得分:0)

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

我想给我的第一个屏幕进行位置选择搜索。我想将查询传递回我的第一个Activity。该Activity是搜索调用和查询接收。但是,“singleTask”破坏了我的计划;(

查询的搜索意图从未到达我的第一个活动。相反,“android.intent.action.MAIN”达到了我的第一个活动。当删除“singleTask”时,Search-Intent会通过。但后来我创建了我的主屏幕的几个实例。

<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代替......