我一直在学习Android,并遇到了launchMode ="singleTask"的问题.该文档指出,当使用此属性时,活动始终作为根活动启动到新任务中.其次,文档说明如果Intent在其任务堆栈中位于其上方的Activities时针对此类Activity,则会丢弃此类Intent(尽管该任务仍然被置于前台).
我一直在玩这个,我观察到的行为完全不同.特别是: - 使用launchMode ="singleTask"的活动并不总是任务堆栈中的根活动.它们只是在具有相同亲和力的现有堆栈的顶部. - 当Intent以此类Activity为目标并且堆栈中有其他活动时,不会丢弃Intent.而是丢弃堆栈中它上面的活动.然后,Intent通过onNewIntent正常传递给Activity.
有人可以确认这是实际行为吗?如果是这样,为什么文件不正确?如果不是我做错了什么...
编辑:
可以在此处找到演示此行为的示例:http: //groups.google.co.uk/group/android-developers/browse_thread/thread/fd8f249803b4688a# 对于交叉发布抱歉,但我无法获得示例一个体面的格式发布在这里...
这是一个问题taskAffinity.当您启动活动时,Android会检查taskAffinity您要启动的活动.如果它与taskAffinity任务中的根活动相同,则它将忽略launchMode="singleInstance"或launchMode="singleTask"(因为这些启动模式将要求Android创建新任务以启动活动)并在当前任务中启动活动.
不幸的是,这没有很好的记录,但taskAffinity优先于launchMode.
如果你真的想要一个singleTask或一个singleInstance活动(这通常不是正确的事情,因为它带来了一堆乱七八糟的东西,你可能会出错),那么你需要确保你的singleInstance或singleTask活动有在清单中<activity>定义如下:
android:taskAffinity=""
Run Code Online (Sandbox Code Playgroud)
我可以在这个模式中添加一些奇怪行为的经验。也许这个问题的答案也对我有帮助。
我想为我的第一个屏幕提供位置选择搜索。我想将查询传递回我的第一个活动。该活动是搜索调用和查询接收。然而,“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>
Run Code Online (Sandbox Code Playgroud)
现在我用 TextView 代替......