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

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

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

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

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

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

Это очистит все виды деятельности на дому.

Предполагая, что вы завершаете экран входа в систему при входе пользователя в систему и дома, а затем все экраны от 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 следующий код внутри LoginActivity onCreate(...) , чтобы прослушивать, когда LoginActivity воссоздается и передается сигнал «EXIT»:

 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 class добавлен в библиотеку поддержки Android.

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

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

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

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

С сайта developer.android.com :

 public void finishAffinity () 

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

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

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

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

Решение, которое я реализовал для этого (я думаю, что нашел его в 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); } 

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

 { 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(); -1  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 же проблема, вы можете использовать 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 (Войти) 

с

  FLAG_ACTIVITY_CLEAR_TOP 

Если вы используете 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 ();

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

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

finishAffinity();

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

ActivityCompat.finishAffinity(YourActivity.this);

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

В уровне API 11 или выше используйте флаг FLAG_ACTIVITY_CLEAR_TASK и FLAG_ACTIVITY_NEW_TASK в Intent, чтобы очистить весь стек активности.

 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 (даже для <11)

 Intent intent = new Intent(getApplicationContext(), LoginActivity.class); ComponentName cn = intent.getComponent(); Intent mainIntent = IntentCompat.makeRestartActivityTask(cn); startActivity(mainIntent); 
  • Является ли массив объектом java
  • Передавать данные из Java Servlet в JSP?
  • отображение AM и PM в маленькой букве после форматирования даты
  • Чтение массива Json в андроиде
  • преобразование растрового изображения Java в байтовый массив
  • Как использовать WeakReference в разработке Java и Android?
  • Завершение программы Java
  • Код Java для преобразования байта в шестнадцатеричный
  • Когда именно это безопасно для утечки для использования (анонимных) внутренних classов?
  • скопируйте 2d-массив в java
  • Как использовать «Статические методы фабрики» вместо конструкторов?
  • Давайте будем гением компьютера.