【问题标题】:Android: Behaviour of launchMode="singleTask" not as described?Android:launchMode="singleTask" 的行为与描述不符?
【发布时间】:2010-09-10 22:42:22
【问题描述】:

我一直在学习 Android,但遇到了关于 launchMode="singleTask" 的问题。文档指出,当使用此属性时,Activity 始终作为根 Activity 启动到新任务中。其次,文档指出,如果在其任务堆栈中存在位于其上方的活动时,如果 Intent 以此类 Activity 为目标,则此类 Intent 将被丢弃(尽管该任务仍被带到前台)。

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

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

编辑:

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

【问题讨论】:

  • 我可以确认这种行为,但我也不明白。子活动被破坏。

标签: android


【解决方案1】:

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

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

如果您真的想要 singleTasksingleInstance 活动(这通常不是正确的做法,因为它会带来一大堆其他令人讨厌的事情,您可能会出错),那么您需要确保您的 singleInstancesingleTask 活动在其 <activity> 定义的清单中具有以下内容:

android:taskAffinity=""

【讨论】:

    【解决方案2】:

    Documentation 说:

    FLAG_ACTIVITY_NEW_TASK ... 产生与 "singleTask" 启动模式 ...

    活动如何以 Intent(FLAG_ACTIVITY_NEW_TASK) depends on activity affinity 开始

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

    因此,singleTask 启动模式必须有相等的亲和性检查。

    【讨论】:

    • 我认为他们都不会产生“相同”的行为。假设亲缘关系正常,singleTask 也会尝试清除除根之外的任务活动。
    【解决方案3】:

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

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

    带有查询的搜索意图从未达到我的第一个活动。相反,“android.intent.action.MAIN”达到了我的第一个活动。删除“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...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 2012-10-16
      • 2020-12-21
      • 1970-01-01
      相关资源
      最近更新 更多