#android #android-activity #workflow-activity #activity-stack
#Android #android-активность #рабочий процесс-действие #активность-стек
Вопрос:
Я пытаюсь выяснить, как реализовать интересную концепцию.
Предположим, в нижней части моего приложения есть панель с 3 кнопками. Мы будем называть их A, B, C. Я хочу, чтобы вы представляли их как 3 области приложения, каждая со своим собственным стеком активности.
Предположим, я нажимаю B, сначала я попадаю на главный экран B. Предположим, что на этом экране есть некоторая функциональность, позволяющая перейти к другому экрану, скажем, к деталям определенного элемента в списке.
Теперь, находясь на экране сведений, я нажимаю кнопку C внизу и попадаю на главный экран C.
Если я нажму B (или нажму кнопку «Назад»), я хочу, чтобы пользователь переходил к последнему экрану в стеке действий B, который является экраном сведений, а не основным экраном B.
Возможно ли это? Если я все правильно понимаю, у меня должно быть 3 задачи: 1 для A, 1 для B и 1 для C, да? Что еще мне нужно было бы сделать?
Комментарии:
1. Вы уверены, что это хорошая идея? Вы собираетесь серьезно запутать пользователей, когда нарушаете обычный стек задач. Необычно отображать навигацию внутри вкладки (или эквивалента вкладки) и нормально отображать подробное представление за пределами контроллера вкладок, что позволяет обойти всю эту проблему (пользователь должен вернуться из B-> Подробное представление, прежде чем они смогут нажать на C).
2. Честно говоря, это предложение кого-то другого. Я категорически против этого. Цель на данный момент — сделать это, позволить им поиграть с этим и понять, почему это плохая идея.
Ответ №1:
Конечно, это возможно и просто реализовать. Но вы должны прочитать это, чтобы понять, как это реализовать.
У вас есть 3 корневых действия: A_main, B_main, C_main. Каждое действие должно запускать новую задачу. Для этого вам нужно:
-
В вашем манифесте объявите для них разные сродства:
активность Android:name=».A_main» android:taskAffinity=».A»
активность android:name=».B_main» android:taskAffinity=».B»/>
-
Чтобы запустить (переключить) задачу, запустите новое намерение, используя флаги (вы можете использовать ApplicationContext):
private static final int ROOT_INTENT_FLAG = Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
Чтобы предоставить пользовательскому интерфейсу возможность переключения между задачами, вы можете использовать, например, меню Android.
Если вы хотите очистить задачу — просто добавьте флаг Intent.FLAG_ACTIVITY_CLEAR_TOP
И…вам нужен какой-нибудь LauncherActivity, который будет запущен при запуске вашего приложения. Это действие должно восстановить последнюю посещенную задачу и завершить себя. Для восстановления — просто используйте intent с флагами сверху (пункт 2).
Комментарии:
1. Есть ли способ уничтожить все задачи? Или использование FLAG_ACTIVITY_CLEAR_TOP очистит все задачи?
2. Нет, вы не можете их уничтожить. Но вы можете переместить их в фоновый режим, используя метод activity moveTaskToBack (). Или … если вы очень хотите их уничтожить, вам следует завершить все действия во всех ваших задачах.
3. Хм … тогда моя проблема заключается в том, что нажатие кнопки «выйти» должно уничтожить все задачи, поэтому следующий пользователь, вошедший в систему, получит новые стеки.
4. Когда новый пользователь сначала запускает задачи (он только что вошел в систему) — добавьте флаг CLEAR_TOP. При повторном входе старого пользователя в систему у вас есть возможность не очищать задачи и восстанавливать историю стека (если хотите).
Ответ №2:
На самом деле, сценарий, который вы описали, состоит только из ОДНОГО стека активности. Количество стеков активности фактически зависит от ОС Android, мы можем сделать все возможное только в соответствии с правилами.
Согласно описанию, история навигации — это B_main -> B_details -> C_main
, после ВОЗВРАТА — это B_main -> B_details
. Если три кнопки реализованы во всех этих Activity
файлах (что можно сделать, настроив некоторую панель кнопок и включив ее в файлы макета), действительно существует только один стек.
Комментарии:
1. Предположим, пользователь нажимает кнопку B и достигает B main, нажимает элемент в списке, достигает B details, нажимает кнопку C и достигает C main, нажимает элемент в списке и достигает C details, затем нажимает кнопку B… Пользователю необходимо было бы перейти к B details, потому что B details был последним экраном, на котором они были, когда покидали «область B» приложения.
2. Стек просто изменяется на B_main -> B_details -> C_main -> C_details, больше ничего. И я считаю, что любой сценарий ваших действий может быть выполнен путем правильной установки флага намерения. Если вы настаиваете на создании нового стека действий после нажатия C, это сделает взаимодействие двух стеков слишком сложным. Было бы лучше тщательно спроектировать навигацию вашего приложения в соответствии с соглашениями.
3. B_main-> B_details -> C_main -> C_details. Теперь нажимайте взад и вперед на кнопки B и C. B_details -> C_details -> B_details -> C_details -> …