“我的第一个应用程序”有一个处理“共享”意图的活动。它在AndroidManifest.xml
中的活动如下所示:
<activity
android:name="com.example.foo.myfirstapp.MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="image/jpeg"/>
</intent-filter>
</activity>
在KitKat中,将相册中的图像共享到“我的第一个应用程序”会导致MainActivity成为相册任务的一部分。这是期望的行为。
在Lollipop中,将相册中的图像共享到“我的第一个应用程序”会导致启动“我的第一个应用程序”的新实例。如果我查看概述屏幕,相册任务就在那里......然后是“我的第一个应用程序”的单独条目。如果我分享另一张图片,我最后会看到两个“我的第一个应用程序”......等等。
问题:如何以与KitKat相同的方式让Lollipop处理共享意图?
这就是我所做的:
我注意到从Album发送的意图根据操作系统设置了不同的标志。 (我使用getIntent()
并查看mFlags
获得了这些内容。)
Kitkat:0x80001
(524289):FLAG_GRANT_READ_URI_PERMISSION,FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
Lollipop:0x18080001
(403177473):FLAG_GRANT_READ_URI_PERMISSION,FLAG_ACTIVITY_MULTIPLE_TASK,FLAG_ACTIVITY_NEW_DOCUMENT,FLAG_ACTIVITY_NEW_TASK
从阅读http://developer.android.com/reference/android/content/Intent.html开始,似乎最后三个标志导致了问题。具体地
当与FLAG_ACTIVITY_MULTIPLE_TASK配对时,修改这两种行为(FLAG_ACTIVITY_NEW_DOCUMENT或FLAG_ACTIVITY_NEW_TASK)以跳过搜索匹配任务并无条件地启动新任务。
我一直试图通过在android:launchMode
中的活动中指定android:documentLaunchMode
和AndroidManifest.xml
来“覆盖”这些标记,但没有成功。
从http://developer.android.com/reference/android/R.attr.html#documentLaunchMode开始,使用documentLaunchMode“never”似乎很有希望,因为
即使Intent包含Intent.FLAG_ACTIVITY_NEW_DOCUMENT,此活动也不会启动到新文档中。这使活动作者能够最终控制其活动的使用方式。 但这没用。
我也考虑过android:taskAffinity
,但似乎没有办法说“请更喜欢你发起的任何任务”。
答案 0 :(得分:1)
害怕你对此无能为力。它不在你的控制之下。这是“相册”应用程序启动其“共享”意图的方式的变化。如果它不希望你的Activity在其任务中,你就不能强迫它在那里。
如果您遇到“共享”活动的多个实例时遇到问题,可以将“共享”活动声明为launchMode="singleTask"
或launchMode="singleInstance"
(具体取决于您的需求。但是,这可能会中断其他的事情。