Завершить все предыдущие действия - PullRequest
337 голосов
/ 13 июня 2011

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

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

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

Ответы [ 24 ]

10 голосов
/ 26 ноября 2013

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

{
Intent intent = new Intent(this, loginScreen.class);
ntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
10 голосов
/ 23 сентября 2011

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

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

// 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);
}
8 голосов
/ 05 марта 2015

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

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

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

Android api 17

8 голосов
/ 12 июня 2015
    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();
7 голосов
/ 19 мая 2018

вместо finish() просто используйте finishAffinity();

6 голосов
/ 13 июня 2011

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

на экране 4 (или любой другой) ->

StartActivity(Log in)
с
FLAG_ACTIVITY_CLEAR_TOP
6 голосов
/ 04 ноября 2016

для 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);
5 голосов
/ 13 июня 2011

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

4 голосов
/ 23 ноября 2018

В моем случае я использую функцию finishAffinity() в последнем действии, например:

finishAffinity()
startHomeActivity()

Надеюсь, это будет полезно.

3 голосов
/ 28 марта 2012

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

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

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

...