Android: запуск режима "один экземпляр"

Я просматривал документацию для одного экземпляра и пробовал несколько образцов. В одном из моих образцов у меня есть три вида деятельности: A- > B- > C, где B имеет android: launchMode = "singleInstance" в манифесте. Активность A и C имеет режим запуска по умолчанию.

Сценарий:

После перехода на C через A и B (то есть A- > B- > C), нажатие кнопки "Назад" из "Активность C" переходит к "Деятельности A" (C- > A), но кнопка "Назад" из операции "А" не выходит из приложение скорее переносит активность B на передний план, а затем нажимает кнопку "Назад" из "Активность B". Приложение

Вопрос

Почему на этапе "А" активируется действие "В", когда нажимается кнопка "Назад" из "Действия А"?

Другой сценарий:

Аналогично, из Activity C, если пользователь нажимает кнопку "Домой" устройства и возвращается с помощью длинного домашнего нажатия, C остается на переднем плане. Но обратный поток нажатия кнопки принимает C- > A → выход из приложения. На этот раз активность B не выйдет на передний план.

Ответ 1

После перехода с A- > B у вас есть 2 задачи: первая содержит A, вторая содержит B. B находится сверху, а A ниже.

Теперь при переходе с B- > C Android запускает активность C в задачу, содержащую A (она не может запустить ее в задачу, содержащую B, потому что B определяется как "singleInstance" , поэтому он запускает ее в задачу, которая имеет ту же "задачуAffinity" , в этом случае задача, содержащая A). Для этого Android выводит задачу, содержащую A на передний план. Теперь у вас есть две задачи: задача, содержащая A и C спереди, а вторая - B ниже.

Теперь вы нажимаете клавишу BACK, которая завершает действие C и возвращается к активности ниже, чем в задаче, а именно C. У вас все еще есть 2 задачи: одна, содержащая C спереди, и та, которая содержит B ниже этого.

Теперь вы снова нажимаете кнопку BACK. Это завершает работу A (и тем самым завершает задачу, которая удерживает A), и возвращает предыдущую задачу в стеке задач, а именно задание, содержащее B. Теперь у вас есть 1 задача: задача, содержащая B.

В вашем другом сценарии, после перехода с A- > B- > C, вы начинаете с двух задач: Задача, содержащая A и C спереди, и второй, содержащий B ниже.

Теперь вы нажимаете кнопку HOME. Теперь вы говорите, что вы "вернетесь к приложению долгое нажатие" . Это не совсем правильно. Вы не можете вернуться в приложение. Вы можете только "вернуться к задаче". Но у вас есть две разные задачи: если вы делаете длинную печать, вы должны увидеть две задачи. У них, вероятно, есть один и тот же значок (если вы не указали другой значок для активности B), чтобы вы не могли отличить их друг от друга. Если вы выберите задачу, содержащую A и C, то эта задача будет перенесена на передний план с активностью C сверху. Если вы сейчас нажмете клавишу BACK, операция C завершится, и под ней будет показана активность A. Если вы снова нажмете клавишу BACK, операция A будет завершена, и вы вернетесь на экран HOME. Задача, содержащая B, по-прежнему находится в списке недавних задач, но больше не находится в стеке задач под вашей другой задачей, потому что когда вы нажимаете кнопку HOME, это похоже на возврат к нулю. Вы начинаете все заново. У вас нет активных задач, поэтому все задачи находятся в строке, они не находятся в стеке и иерархии нет.

Кроме того, в вашем вопросе вы используете фразу "выходит из приложения" . Это также не совсем правильно. Единственное, что нажала кнопка BACK, - это завершить текущую деятельность. Если текущая активность является единственным действием в задаче, она также завершает эту задачу. Однако это не означает "выйти из приложения". Особенно в вашем случае, так как ваше приложение действительно существует в двух отдельных задачах.

Надеюсь, это ясно.

Ответ 2

Из doc

  • Действия "singleInstance" могут только начинать задание. Они всегда находятся в корне стека активности. Кроме того, устройство может удерживать только один экземпляр активности за один раз - только одна такая задача.

  • С другой стороны, деятельность "singleInstance" не позволяет другим действиям быть частью ее задачи. Это единственное занятие в задаче. Если он запускает другое действие, эта деятельность назначается другой задаче