Подтвердить что ты не робот

Android возвращается к первому действию при нажатии кнопки

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

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

4b9b3361

Ответ 1

button.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        startActivity(new Intent(D.this, A.class));
    }
});

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

Ответ 2

Единственная проблема, с которой я вижу использование 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 );

Ответ 3

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

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

В манифесте:

android:name=".A"
android:launchMode="singleTask"

Ответ 4

Я использую 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());

Что все

Ответ 5

Прежде всего, я не могу поверить, что у Android нет простого эквивалента iOS poptorootviewcontroller.

Проблема с использованием намерения и startactivity заключается в том, что, насколько я знаю, он воссоздает корневую активность, которая является проблемой, если, например, она использует асинхронный сетевой запрос для загрузки данных и компоновки интерфейса. Это может иметь неприятные визуальные эффекты.

Вот творческое решение, которое я использовал в моем проекте friendfolder:

Создать глобальное логическое значение: 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.

Ответ 6

Kotlin

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

Измените MainActivity на основную активность.

В любой активности просто вызывается:

  this.popToRoot()