Как вернуться к основному действию после трех отключений?

#android

#Android

Вопрос:

В моем приложении есть четыре действия; MainActivity, ListActivity1 (L1), ListActivity2 (L2), ListActivity3 (L3). Из Main пользователь переходит на уровень L1, нажав на кнопку. После выбора элемента в L1 пользователь переходит к L2, а затем к L3 после выбора элемента в L2. В L3 при выборе элемента запускается всплывающее окно Да/Нет. Если пользователь выбирает «Нет», пользователь остается на L3. Если пользователь выбирает «Да», пользователь возвращается обратно к Основному.

Вот в чем вопрос: если пользователь выбирает «да», переходя к основному и нажимая кнопку «Назад», он возвращается к L3. Чего я хочу, так это того, что если пользователь перешел к L3, выбрал «да» и вернулся к основному, нажатие кнопки «Назад» должно привести его к главному экрану. Т.е. я хочу удалить «обратную трассировку» до L3.

Как мне этого добиться?

(Main и ListActivities запускают новое действие с startActivity(new Intent(foo, Bar.class)) помощью )

Комментарии:

1. Если пользователь выбирает «да» на L3, должен ли он иметь возможность нажать «Назад», чтобы перейти к L2, а затем снова вернуться к L1? Или L1 и L2 не имеют значения после того, как вы перейдете к L3?

2. L1 и L2 имеют значение только в том случае, если на L3 выбрано значение «нет». Если выбрано значение «Да», отмените все «обратные трассировки» до L3, L2 и L1. Я не уверен, что это имеет смысл, но я надеюсь, что это так.

Ответ №1:

Вы могли бы сделать что-то подобное, если выбрано значение yes:

 Intent intent=new Intent(context,MainActivity.class);    
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);                    
startActivity(intent);
 

Это очистит стек действий, поэтому L1, L2 и L3 будут удалены, а существующее MainActivity будет запущено с новым намерением.

Комментарии:

1. Я думаю, что в этом вызове для завершения нет необходимости. Если действие является дочерним действием, оно будет завершено ОС из-за флага clear top.

2. Если он находится в прослушивателе диалогового окна, сохранение ссылки на действие только для выполнения ненужного вызова для завершения — пустая трата памяти.

Ответ №2:

Что вы можете сделать, так это при запуске L2 и L3 запускать его с помощью startAcitiv

startActivityForResult(намерение, REQUEST_CODE);

Вы можете определить код результата в своих действиях L1 и L2. В L3, когда пользователь нажимает «Да», перед завершением действия вы вызываете

SetResult(ПОЛЬЗОВАТЕЛЬ_CLICKED_YES);

Вы можете определить USER_CLICKED_YES как целое число, которое известно L2.

В L2 вы можете реализовать onActivityResult(), и в методе вы проверяете, соответствует ли результат L3 тому, является ли он USER_CLICKED_YEs или нет, если это так, вы завершаете L2, если нет, ничего не делайте.

Таким образом, вы создаете «цепочку завершающих действий», чтобы Действия могли завершаться сами по себе, пока не дойдут до действия, которое вы не хотите завершать.

Комментарии:

1. Этот способ не является оптимальным решением для случая OP, но может быть полезен кому-то другому. Другой ответ — это лучший способ добиться очистки стека. Пользователь увидел бы несколько анимаций закрытия активности, если бы вы реализовали это таким образом, поэтому я предлагаю вам этого не делать.