Android возвращается к первому действию по нажатию кнопки - PullRequest
23 голосов
/ 06 мая 2010

Я пишу приложение, в котором я имею дело с 4 действиями, скажем, A, B, C & D. Деятельность A вызывает B, B вызывает C, C вызывает D. В каждом из действий у меня есть кнопка с именем "Главная кнопка. Когда пользователь нажимает кнопку «Домой» в любом из действий B, C, D, приложение должно вернуться к экрану действий A?

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

Ответы [ 6 ]

69 голосов
/ 06 мая 2010
button.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        startActivity(new Intent(D.this, A.class));
    }
});

Объявите А в своем манифесте с android:launchMode="singleTask".Таким образом, когда вы звоните startActivity() из других ваших активностей, и А уже работает, он просто выведет его на фронт.В противном случае он запустит новый экземпляр.

24 голосов
/ 28 августа 2013

Единственная проблема, которую я вижу при использовании android:launchMode="singleTask", - это когда вы минимизируете приложение и запускаете приложение, снова нажимая значок приложения, затем приложение запускается с нуля и не получает его состояния. поэтому я решил использовать

intent.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP );

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

Intent intent = new Intent( context, MyActivity.class );
intent.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP );
current_activity.startActivity( intent );
1 голос
/ 21 ноября 2017

Котлин

fun Context.popToRoot()
{
    val intent = Intent(this, MainActivity::class.java)
    intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
    startActivity(intent)
}

Измените MainActivity на ваш основной актив.

В любой деятельности просто позвоните:

  this.popToRoot()
1 голос
/ 08 сентября 2017

Прежде всего, я не могу поверить, что в 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.

0 голосов
/ 04 ноября 2016

Я использую https://github.com/greenrobot/EventBus для этого. В корневой активности вы должны подписаться на событие

EventBus.getDefault () регистр (это).

Тогда вы должны определить обратный вызов события

 public void onEvent(LogoutEvent event) {
             // your implementation
            logout();
         }

и слушатель кнопки выхода из системы должен иметь такой код:

finish(); // you must finish previous activity
EventBus.getDefault().post(new LogoutEvent());

Вот и все

0 голосов
/ 16 октября 2016

Это работает для меня

Intent intent = new Intent(D.this, A.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);

В манифесте:

android:name=".A"
android:launchMode="singleTask"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...