Как закрыть все предыдущие действия Android, кроме первого?

#android #android-activity

Вопрос:

Рассмотрим гипотетическое приложение для электронного банкинга, в котором следующий поток:

Главная активность -> Конвертерактивность валюты ->> Возможность выбора ->>> Входная транзакционная активность ->>>> TransferReviewActivity ->>>>> TransferConfirmationActivity

Все действия (кроме домашней активности) вызываются как обычно startActivity() , так и без finish() . Это сделано намеренно, чтобы пользователь мог просмотреть входные данные на предыдущем экране. Но как только вы достигнете TransferConfirmationActivity и нажмете назад, я хочу вернуться к HomeActivity (и другие действия будут убиты).

Как это сделать?

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

1. Начните все действия с помощью функции startActivityForResult(). В TransferConfirmationActivity добавьте putExtra к намерению, которое вы используете для завершения (), что указывает на то, что действие получения также должно быть закрыто.

Ответ №1:

Я думаю, что вы можете использовать Intent.FLAG_ACTIVITY_CLEAR_TOP флаг для достижения этой цели.

Согласно документации Android о FLAG_ACTIVITY_CLEAR_TOP

Если задано, и запускаемое действие уже выполняется в текущей задаче, то вместо запуска нового экземпляра этого действия все остальные действия поверх него будут закрыты, и это Намерение будет передано (теперь вверху) старому действию как новое намерение.

 val intent = Intent(this, HomeActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
startActivity(intent)
 

Ответ №2:

запустите домашнюю активность и добавьте флаг в намерение

 Intent intent = new Intent(activity, HomeActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
 

Ответ №3:

Переопределите onBackPressed() TransferConfirmationActivity и вернитесь к HomeActivity этому:

 Intent intent = new Intent(this, TransferConfirmationActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
                Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
finish();
 

Это вернет пользователя к существующему экземпляру HomeActivity , удалив при этом все остальные действия из стека.

Если вы предпочитаете создать новый экземпляр HomeActivity и вернуться к нему, просто снимите флаг Intent.FLAG_ACTIVITY_SINGLE_TOP .