Lollipop: заставить мою активность остаться в задаче, которая запустила намерение поделиться
"Мое первое приложение" имеет действие, которое обрабатывает намерение "поделиться". Его деятельность в 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 передача изображения из альбома в "My First App" приводит к тому, что MainActivity становится частью задачи альбома. Это желаемое поведение.
В Lollipop при передаче изображения из альбома в "My First App" запускается новый экземпляр "My First App". Если я посмотрю на обзорный экран, там будет задание альбома... а затем есть отдельная запись для "My First App". Если я поделюсь другим изображением, я получу два экземпляра "Моего первого приложения"... и т. Д.
Вопрос: Как мне сделать так, чтобы Lollipop обрабатывал намерение общего ресурса так же, как KitKat?
Вот что я сделал: я заметил, что для намерений, отправленных из альбома, установлены разные флаги в зависимости от ОС. (Я получил это с помощью 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 кажется, что эти последние три флага вызывают проблему. конкретно
В сочетании с 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 "никогда" кажется многообещающим, так как
Это действие не будет запущено в новый документ, даже если Intent содержит Intent.FLAG_ACTIVITY_NEW_DOCUMENT. Это дает писателю деятельности полный контроль над тем, как используется его деятельность. но это не сработало.
Я тоже считала android:taskAffinity
, но, кажется, нет способа сказать "пожалуйста, предпочитайте любую задачу, которую вы начали".
1 ответ
Боюсь, что вы ничего не можете с этим поделать. Это не под вашим контролем. Это изменение в способе, которым приложение "Альбом" запускает свое "общее" намерение. Если он не хочет, чтобы ваша Активность выполняла свою задачу, вы не можете заставить ее там.
Если у вас есть проблемы с наличием нескольких экземпляров вашей активности "общий доступ", вы можете объявить свою активность "общий доступ" как launchMode="singleTask"
или же launchMode="singleInstance"
(в зависимости от ваших потребностей. Это может, однако, сломать другие вещи.