Lollipop:让我的 activity 留在启动共享意图的任务中
Lollipop: making my activity stay in the task that launched the share intent
“我的第一个应用程序”有一个 activity 处理“分享”意图。它在 AndroidManifest.xml
中的 activity 看起来像这样:
<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 中,将相册中的图像共享到“我的第一个应用程序”会导致“我的第一个应用程序”的新实例启动。如果我查看概览屏幕,相册任务就在那里...然后有一个单独的 "My First App" 条目。如果我分享另一张图片,我会得到两个实例 "My First App"...等等
问:如何让 Lollipop 像 KitKat 一样处理分享意图?
这是我所做的:
我注意到从相册发送的意图根据 OS 设置了不同的标志。 (我使用 getIntent()
并查看 mFlags
得到了这些。)
奇巧:0x80001
(524289):FLAG_GRANT_READ_URI_PERMISSION、FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
棒棒糖: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 来看,似乎是这最后三个标志导致了问题。具体
When paired with FLAG_ACTIVITY_MULTIPLE_TASK both of these behaviors (FLAG_ACTIVITY_NEW_DOCUMENT or FLAG_ACTIVITY_NEW_TASK) are modified to skip the search for a matching task and unconditionally start a new task.
我一直试图通过在 AndroidManifest.xml
中的 activity 中指定 android:launchMode
和 android:documentLaunchMode
来“覆盖”这些标志,但没有成功。
从 http://developer.android.com/reference/android/R.attr.html#documentLaunchMode 开始,使用 documentLaunchMode “从不”似乎很有希望,因为
This activity will not be launched into a new document even if the Intent contains Intent.FLAG_ACTIVITY_NEW_DOCUMENT. This gives the activity writer ultimate control over how their activity is used.
but this didn't work.
我也考虑过android:taskAffinity
,但似乎没有办法说“请选择启动你的任务”。
恐怕你对此无能为力。它不在你的控制之下。这是 "Album" 应用启动其 "share" Intent 的方式的变化。如果它不想让你的 Activity 参与它的任务,你不能强迫它在那里。
如果您对 "share" activity 的多个实例有疑问,您可以将 "share" activity 声明为 launchMode="singleTask"
或 launchMode="singleInstance"
(取决于您的需要。但是,这可能会破坏其他东西。
“我的第一个应用程序”有一个 activity 处理“分享”意图。它在 AndroidManifest.xml
中的 activity 看起来像这样:
<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 中,将相册中的图像共享到“我的第一个应用程序”会导致“我的第一个应用程序”的新实例启动。如果我查看概览屏幕,相册任务就在那里...然后有一个单独的 "My First App" 条目。如果我分享另一张图片,我会得到两个实例 "My First App"...等等
问:如何让 Lollipop 像 KitKat 一样处理分享意图?
这是我所做的:
我注意到从相册发送的意图根据 OS 设置了不同的标志。 (我使用 getIntent()
并查看 mFlags
得到了这些。)
奇巧:0x80001
(524289):FLAG_GRANT_READ_URI_PERMISSION、FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
棒棒糖: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 来看,似乎是这最后三个标志导致了问题。具体
When paired with FLAG_ACTIVITY_MULTIPLE_TASK both of these behaviors (FLAG_ACTIVITY_NEW_DOCUMENT or FLAG_ACTIVITY_NEW_TASK) are modified to skip the search for a matching task and unconditionally start a new task.
我一直试图通过在 AndroidManifest.xml
中的 activity 中指定 android:launchMode
和 android:documentLaunchMode
来“覆盖”这些标志,但没有成功。
从 http://developer.android.com/reference/android/R.attr.html#documentLaunchMode 开始,使用 documentLaunchMode “从不”似乎很有希望,因为
This activity will not be launched into a new document even if the Intent contains Intent.FLAG_ACTIVITY_NEW_DOCUMENT. This gives the activity writer ultimate control over how their activity is used. but this didn't work.
我也考虑过android:taskAffinity
,但似乎没有办法说“请选择启动你的任务”。
恐怕你对此无能为力。它不在你的控制之下。这是 "Album" 应用启动其 "share" Intent 的方式的变化。如果它不想让你的 Activity 参与它的任务,你不能强迫它在那里。
如果您对 "share" activity 的多个实例有疑问,您可以将 "share" activity 声明为 launchMode="singleTask"
或 launchMode="singleInstance"
(取决于您的需要。但是,这可能会破坏其他东西。