Завершить все предыдущие действия

Мое приложение имеет следующие экраны потоков:

Home->screen 1->screen 2->screen 3->screen 4->screen 5

Теперь у меня есть общая кнопка log out на каждом экране

(Home/ screen 1 / screen 2 /screen 3/ screen 4 / screen 5)

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

Я пробовал почти все FLAG_ACTIVITY для достижения этого. Я также просматриваю некоторые ответы в stackoverflow, но не в состоянии решить проблему. Мое приложение находится на Android 1.6, поэтому невозможно использовать FLAG_ACTIVITY_CLEAR_TASK

Есть ли способ решить проблему?

Ответ 1

Использование:

Intent intent = new Intent(getApplicationContext(), Home.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

Это очистит все действия на дому.

Предполагая, что вы завершаете экран входа в систему при входе пользователя в систему и создании дома, а затем все экраны от 1 до 5 поверх этого. Код, который я отправил, вернет вас на главный экран, завершая все остальные действия. Вы можете добавить дополнительный код в намерение и прочитать его в действии на домашнем экране и завершить его (возможно, снова запустить экран входа оттуда или что-то еще).

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

Надеюсь, это поможет.

Ответ 2

Вы можете попробовать Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK. Он полностью очистит все предыдущие действия и начнет новую деятельность.

Ответ 3

Перед запуском нового действия просто добавьте следующий код:

finishAffinity();

Или, если вы хотите, чтобы он работал в предыдущих версиях Android:

ActivityCompat.finishAffinity(this);

Ответ 4

Когда пользователь хочет выйти из всех открытых действий, они должны нажать кнопку, которая загружает первое действие, которое запускается при запуске приложения, очищает все остальные действия, а затем завершает последний оставшийся процесс, Пропустите следующий код, когда пользователь нажимает кнопку выхода. В моем случае LoginActivity - это первое действие в моей программе.

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);

Приведенный выше код очищает все действия, кроме LoginActivity. Затем введите следующий код внутри LoginActivity onCreate(...), чтобы прослушать, когда LoginActivity воссоздается, и передается сигнал "EXIT":

if (getIntent().getBooleanExtra("EXIT", false)) {
    finish();  
}

Почему так сложно сделать кнопку выхода в Android?

Android пытается отговорить вас от наличия кнопки "выхода" в вашем приложении, потому что они хотят, чтобы пользователь никогда не заботился о том, работают ли программы, которые они используют, в фоновом режиме или нет.

Разработчики ОС Android хотят, чтобы ваша программа была в состоянии выдержать неожиданное завершение работы и выключение телефона, а когда пользователь перезапустил программу, они поднимутся прямо там, где они остановились. Таким образом, пользователь может получить телефонный звонок во время использования своего приложения и открыть карты, которые требуют, чтобы ваше приложение было освобождено для получения дополнительных ресурсов.

Когда пользователь возобновляет ваше приложение, они подбираются прямо там, где они останавливаются без перерывов. Эта кнопка выхода узурпирует власть от менеджера активности, что может вызвать проблемы с автоматически управляемым жизненным циклом программы Android.

Ответ 5

Intent intent = new Intent(this, classObject);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

Это будет работать для всех версий Android. Где IntentCompat класс добавлен в библиотеку поддержки Android.

Ответ 6

Используйте следующие действия для деятельности

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);

удалить флаг CLEAR_TASK для использования фрагмента.

Я надеюсь, что это может быть полезно для некоторых людей.

Ответ 7

От developer.android.com:

public void finishAffinity ()

Добавлен в уровень API 16

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

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

Ответ 8

Решение, которое я реализовал для этого (я думаю, что нашел его на Qaru где-то, но я не помню, поэтому благодаря тому, кто это сделал в первую очередь):

Из любой вашей деятельности сделайте следующее:

// Clear your session, remove preferences, etc.
Intent intent  = new Intent(getBaseContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

Затем в вашем LoginActivity перезапишите onKeyDown:

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        moveTaskToBack(true);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

Ответ 9

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

{
Intent intent = new Intent(this, loginScreen.class);
ntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}

Ответ 10

Если ваше приложение имеет минимальную версию sdk 16, вы можете использовать finishAffinity()

Завершите это действие, а также все действия сразу под ним в текущей задаче с одинаковой близостью.

Это работа для меня. На экране "Вверх оплаты" удалите все действия в обратном стеке,

@Override
public void onBackPressed() {
         finishAffinity();
        startActivity(new Intent(PaymentDoneActivity.this,Home.class));
    } 

http://developer.android.com/reference/android/app/Activity.html#finishAffinity%28%29

Ответ 11

У меня такая же проблема вы можете использовать IntentCompat, например:

import android.support.v4.content.IntentCompat;
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);

этот код работает для меня.

Android api 17

Ответ 12

    Intent i1=new Intent(getApplicationContext(),StartUp_Page.class);
i1.setAction(Intent.ACTION_MAIN);
i1.addCategory(Intent.CATEGORY_HOME);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
i1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i1);
finish();

Ответ 13

Вход в систему > Главная- > экран 1- > экран 2- > экран 3- > экран 4- > экран 5

на экране 4 (или любом другом) →

StartActivity(Log in)
с помощью
FLAG_ACTIVITY_CLEAR_TOP

Ответ 14

Если вы используете startActivityForResult() в своих предыдущих действиях, просто переопределите OnActivityResult() и вызовите метод finish(); внутри него во всех действиях.. Это выполнит задание...

Ответ 15

для API >= 15 для API 23 простое решение.

 Intent nextScreen = new Intent(currentActivity.this, MainActivity.class);
 nextScreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
 startActivity(nextScreen);
 ActivityCompat.finishAffinity(currentActivity.this);

Ответ 16

На стороне примечания, хорошо знать
Этот ответ работает (fooobar.com/questions/20457/...)

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
this.finish();

тогда как это не работает

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

.setFlags() заменяет любые предыдущие флаги и не добавляет никаких новых флагов, а .addFlags() делает.

Итак, это также будет работать

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

Ответ 17

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

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

А также, когда после входа в систему, если вы вызываете новую активность, не используйте finish();

Ответ 18

Если вы зарегистрируете пользователя в screen 1 и оттуда перейдете на другие экраны, используйте

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

Ответ 19

Просто, когда вы переходите с экрана входа в систему, а не заканчивая экран входа в систему.

И затем во всех последующих действиях используйте это для выхода:

final Intent intent = new Intent(getBaseContext(), LoginScreen.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);

Он отлично работает.

Ответ 20

Я нашел этот путь, он очистит всю историю и выйдет

Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);
Intent intent = new Intent(getApplicationContext(), SplashScreen.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

finish();
System.exit(0);

Ответ 21

Я нашел это решение для работы на каждом устройстве, несмотря на уровень API (даже для < 11)

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);

Ответ 22

Попробуйте это

  • для всех версий API

    Intent intent = new Intent(this, "Your_Class_name".class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | 
    Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
            startActivity(intent);
            finish();
    
  • для выше API 11

    finishAffinity();