Как удалить активность singleTask с помощью taskAffinity из последних задач после ее завершения?

Предположим, у нас есть два действия.

A – основное действие, то есть "домашняя программа запуска включена" (правильные фильтры намерений и т. д.).

B – корневое действие задачи со спецификацией singleTask. (может быть только один экземпляр этого действия) и с настраиваемой задачейAffinity (чтобы отличать ее от основного корня задачи).

Предположим, что B представляет собой задачу, которая действительна только тогда, когда она не завершена - вернуться к ней или начать ее снова с последних задач после ее завершения не вариант.

В какой-то момент времени A запускает B, чтобы начать новую задачу. Цель состоит в том, чтобы удалить B из списка недавних задач, когда пользователь закончит B. Пользователь может перейти от B к другим задачам (используя долгое нажатие на дом), а затем вернуться к B, пока он не завершен. Запуск A из панели запуска не выведет B на передний план, поскольку у них разные задачи.

Android распознает B как корень задачи, поэтому B отображается в списке последних задач, даже если она завершена, и пользователь всегда может вернуться к ней. Это не решение - переместить B в одну задачу с A, потому что во время работы B пользователь должен иметь возможность переключаться между задачами A и B. Добавление excludeFromRecents в манифест B полностью удаляет его из списка последних задач, и это тоже плохое решение.

Как этого добиться? (Извините за мой плохой английский)


person Michael P    schedule 06.06.2012    source источник
comment
Неверно вызывать finish() в onResume() после завершения задачи?   -  person pawelzieba    schedule 06.06.2012
comment
Но он по-прежнему остается в списке последних задач   -  person Michael P    schedule 07.06.2012
comment
@MichaelP Вы хотите, чтобы он никогда не появлялся в недавних задачах? Или просто исчезнуть, когда закончите?   -  person Fuzzical Logic    schedule 11.06.2012
comment
@FuzzicalLogic он должен исчезнуть, когда закончите.   -  person Michael P    schedule 11.06.2012
comment
@MichaelP, как ты решил свою проблему?   -  person Erum    schedule 20.02.2015


Ответы (2)


Стандартный ответ

Извините, что приношу плохие новости, но эта функциональность не может быть достигнута с использованием стандартных методов без переопределения того, как работает ваше приложение. Даже в этом случае он будет работать только до тех пор, пока работает ваше приложение. Кроме того, для этого потребуется рутованное устройство со специализированным ПЗУ, потому что вы все равно не можете переопределить функциональность кнопки «Домой». Все, что вы можете сделать, это ответить на onNewIntent(), который не срабатывает, если вы долго нажимаете кнопку «Домой».

Недавние задачи специально предназначены для простоты использования для пользователя, чтобы позволить им вернуться к любым приложениям, которые они использовали, независимо от того, запущено ли приложение. Однако есть и хорошие новости. Этот процесс не поддерживает ваше приложение! Это просто значок, указывающий на ваш пакет.

К сожалению, это означает, что если ваше приложение все еще работает, то происходит что-то еще, что поддерживает его работу.

Нестандартный ответ

Это может быть возможно путем редактирования свойств пакета во время выполнения (во многом так же, как вы можете включать/отключать компоненты из кода Java). Это крайне не рекомендуется, поскольку недавние задачи — это удобная функция базовой платформы Android. Это потребует некоторых исследований.

person Fuzzical Logic    schedule 11.06.2012

С небольшим опозданием, но это по-прежнему занимает первое место в Google. См. этот ответ для возможного решения.

В вашем случае вам придется:

  • Создайте новую активность C с именем ExitActivity и добавьте флаги манифеста, как описано в другом ответе.
  • В манифесте Activity B должны быть указаны следующие атрибуты: android:taskAffinity="com.example.ActivityB" android:allowTaskReparenting="true" android:launchMode="singleTask" android:documentLaunchMode="always"
  • Установите атрибут сходства задач на C, чтобы он был таким же, как B
  • Вызов Intent.addFlags в ExitActivity должен быть только тремя последними: intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
person Jeshurun    schedule 16.03.2017