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


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

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 299

24 ответа:

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

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

это очистит все действия на верхней части дома.

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

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

надеюсь, что это помогает.

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

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

finishAffinity();

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

ActivityCompat.finishAffinity(this);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

от developer.android.com:

public void finishAffinity ()

добавлено в API level 16

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

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

Если ваше приложение имеет минимальную версию 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

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

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

// 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);
}

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

{
Intent intent = new Intent(this, loginScreen.class);
ntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
    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();

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

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

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

Android api 17

на боковой ноте, хорошо знать
Этот ответ работает (https://stackoverflow.com/a/13468685/7034327)

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);

войти - > Главная - > экран 1 - > экран 2 - >Экран 3 - >Экран 4 - >экран 5

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

StartActivity(Log in)
с
FLAG_ACTIVITY_CLEAR_TOP

Я думаю, что я опоздал, но есть простой и короткий ответ. Существует метод finishAffinity () в Activity, который завершит текущую активность и все родительские действия, но он работает только в Android 4.1 или выше.

для API 16+ используйте

finishAffinity();

Для ниже 16, используйте

ActivityCompat.finishAffinity(YourActivity.this);

надеюсь, что это помогает!

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

для 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);

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

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

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

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

в API уровня 11 или выше, используйте FLAG_ACTIVITY_CLEAR_TASK и flag_activity_new_task флаг на намерение очистить весь стек действий.

Intent i = new Intent(OldActivity.this, NewActivity.class);
// set the new task and clear flags
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)
startActivity(i);

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

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

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

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

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

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

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

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);

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

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