Как удалить однозадачное действие с taskAffinity из недавних задач, когда оно будет завершено?
Предположим, у нас есть два вида деятельности.
A - основное действие, то есть "домашний лаунчер включен" (фильтры правильных намерений и т. Д.)
B - действие корня задачи со спецификацией singleTask (может быть только один экземпляр этого действия) и с настраиваемым taskAffinity (чтобы отличить его от основного корня задачи).
Предположим, что B представляет задачу, которая действительна только в том случае, если она не завершена - возврат к ней или повторный запуск из недавних задач после ее завершения невозможен.
В какой-то момент времени - А начинает В, чтобы начать новое задание. Цель состоит в том, чтобы удалить B из списка недавних задач, когда пользователь заканчивает B. Пользователь может перейти от B к другим задачам (используя долгое нажатие в домашних условиях), а затем вернуться к B, пока оно не завершено. Запуск A из панели запуска не выведет B на передний план, так как у них разные сродства к задачам.
Android распознает B как корень задачи, поэтому B отображается в списке недавних задач, даже если он завершен, и пользователь всегда может вернуться к нему. Это не решение, чтобы переместить B к одной задаче с A, потому что во время работы B пользователь должен иметь возможность переключаться между задачами A и B. Добавление excludeFromRecents в манифест B полностью удаляет его из списка недавних задач, и это тоже плохое решение.
Как этого добиться? (Извините за мой плохой английский)
2 ответа
Стандартный ответ
Извините, что несу плохие новости, но эта функциональность не может быть достигнута с использованием стандартных методов без нарушения работы вашего приложения. Даже тогда, это будет работать только до тех пор, пока ваше приложение работает. Кроме того, для этого потребуется рутованное устройство со специализированным ПЗУ, поскольку в любом случае вы не можете переопределить функциональность кнопки "Домой". Все, что вы можете сделать, это ответить на onNewIntent()
который не срабатывает, если вы долго нажимаете кнопку Home.
Недавние Задачи предназначены для простоты использования для пользователей, чтобы позволить им вернуться к любым приложениям, которые они использовали, независимо от того, запущено ли приложение. Однако есть и хорошие новости. Этот процесс не поддерживает ваше приложение в живых! Это просто значок, указывающий на ваш пакет.
К сожалению, это означает, что, если ваше приложение все еще работает, происходит что-то еще, что поддерживает его работу.
Нестандартный ответ
Это может быть возможно путем редактирования свойств пакета во время выполнения (во многом так же, как вы можете включать / отключать компоненты из кода Java). Это очень не рекомендуется, потому что последние задачи - это удобство использования базовой платформы Android. Это потребует некоторых исследований.
Немного поздно, но это по-прежнему считается главным хитом в Google. Пожалуйста, посмотрите этот ответ для возможного решения.
В вашем случае вам придется:
- Создайте новую активность C с именем ExitActivity и добавьте флаги манифеста, как описано в другом ответе.
- Операция 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);