我一直在学习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# 很抱歉这个交叉发布,但是我无法以合适的格式得到这个例子来发布这里......
答案 0 :(得分:6)
这是taskAffinity
的问题。当您开始活动时,Android会检查您要启动的活动的taskAffinity
。如果它与您的任务中根活动的taskAffinity
相同,则忽略launchMode="singleInstance"
或launchMode="singleTask"
(因为这些启动模式需要Android创建一个新任务以启动活动,并在当前任务中启动活动。
不幸的是,这没有详细记录,但taskAffinity
优先于launchMode
。
如果你真的想要一个singleTask
或singleInstance
活动(这通常不是正确的事情,因为它带来了一大堆其他令人讨厌的东西,你可能会出错) ,然后您需要确保您的singleInstance
或singleTask
活动在其<activity>
定义中的清单中包含以下内容:
android:taskAffinity=""
答案 1 :(得分:3)
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代替......