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

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

Сценарий:

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

Вопрос

Почему Деятельность B выходит на передний план, когда кнопка Назад нажимается из Действия A?

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

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

2 ответа

Решение

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

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

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

Теперь вы снова нажимаете кнопку НАЗАД. Это завершает действие A (и тем самым завершает задачу, в которой находился A) и переносит предыдущую задачу в стеке задач на передний план, а именно задачу, содержащую B. Теперь у вас есть 1 задача: задача, содержащая B.

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

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

Также в своем вопросе вы используете фразу "выходит из приложения". Это также не совсем правильно. Единственное, что делает нажатие кнопки НАЗАД - это завершить текущее действие. Если текущая операция является единственной операцией в задаче, она также завершает эту задачу. Тем не менее, это не "выйти из приложения". Особенно в вашем случае, так как ваше "приложение" фактически существует в 2 отдельных задач.

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

Из документа

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

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

Другие вопросы по тегам