Прежде всего, я не могу поверить, что в Android нет простого эквивалента iOS poptorootviewcontroller.
Проблема с использованием намерения и стартовой активности состоит в том, что, насколько я знаю, он воссоздает корневую активность, что является проблемой, если, например, он использует асинхронный сетевой запрос для загрузки данных и компоновки интерфейса. Это может иметь неприятные визуальные эффекты.
Вот креативное решение, которое я использовал в своем проекте друзей:
Создать глобальное логическое значение: public boolean myBool = true;
Сделайте это в классе MyApplication и зарегистрируйте класс в манифесте:
<application
android:name=".MyApplication"
Активность A является корнем, сделайте это в onResume:
if(((MyApplication) this.getApplication()).myBool == false) {
if(isTaskRoot()) {
((MyApplication) this.getApplication()).myBool = true;
} else {
finish();
}
}
В каждом действии, которое будет идти поверх Упражнения A, введите этот код:
@Override
public void onResume() {
super.onResume();
if(((MyApplication) this.getApplication()).myBool == false) {
finish();
}
}
@Override
public boolean onSupportNavigateUp(){
((MyApplication) this.getApplication()).myBool = false;
finish();
return true;
}
Вы можете даже поместить это в упражнение A, если вы размещаете другие экземпляры A поверх корневого A. onSupportNavigateUp для кнопки вверх. Замените этот метод другим, если используете свою собственную кнопку.
Теперь, когда у вас есть несколько действий, наложенных сверху на A, и вы нажимаете кнопку «вверх», верхнее действие завершится, и система вызовет onresume для действия, указанного ниже в стеке, и завершится. Это будет работать в цепочке вплоть до корня A.