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:launchModeandroid: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"(取决于您的需要。但是,这可能会破坏其他东西。