Мое приложение имеет следующие экраны потока:
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 по 5 поверх этого. Код, который я разместил, вернет вас на главный экран и завершит все остальные действия. Вы можете добавить дополнительное в намерение и прочитать его на домашнем экране, а также завершить его (возможно, снова запустить экран входа в систему или что-то еще).
Я не уверен, но вы также можете попробовать войти в систему с этим флагом. Я не знаю, как будут организованы мероприятия в этом случае. Так что не знаю, удалит ли он те, что находятся под экраном, в том числе тот, на котором вы сейчас находитесь, но это определенно верный путь.
Надеюсь это поможет.
источник
singleInstance
, рассмотрите возможность использованияFLAG_ACTIVITY_CLEAR_TOP|FLAG_ACTIVITY_SINGLE_TOP
в качестве флагов для Намерения. Это завершит промежуточные действия и начнет (или вернет на передний план) желаемое действие.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
к моим действиям не помогло мне. Оно не завершило промежуточные действия. Когда я нажимаю обратно с экрана входа в систему, я вижу предыдущие действия. Вот мой кодIntent intent=new Intent(BaseActivity.this, Login.class);intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);startActivity(intent);
.Вы можете попробовать
Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK
. Это полностью очистит все предыдущие действия и начнет новую деятельность.источник
Прежде чем запускать новую активность, просто добавьте следующий код:
Или, если вы хотите, чтобы он работал в предыдущих версиях Android:
источник
Когда пользователь желает выйти из всех открытых действий , он должен нажать кнопку, которая загружает первое действие, которое запускается при запуске приложения, очистить все остальные действия, а затем завершить последнее оставшееся действие. Запустите следующий код, когда пользователь нажимает кнопку выхода. В моем случае
LoginActivity
это первое действие в моей программе для запуска.Приведенный выше код очищает все действия, кроме
LoginActivity
. Затем поместите следующий код вLoginActivity
's'onCreate(...)
, чтобы прослушивать, когдаLoginActivity
воссоздается и передается сигнал 'EXIT':Почему создание кнопки выхода в Android так сложно?
Android изо всех сил пытается отговорить вас от наличия кнопки «выход» в вашем приложении, потому что они хотят, чтобы пользователь никогда не заботился о том, работают ли программы, которые они используют, в фоновом режиме или нет.
Разработчики ОС Android хотят, чтобы ваша программа выдерживала неожиданное отключение и отключение телефона, а когда пользователь перезапускает программу, он начинает с того места, на котором остановился. Таким образом, пользователь может получить телефонный звонок, пока он использует ваше приложение, и открыть карты, которые требуют освобождения вашего приложения для получения дополнительных ресурсов.
Когда пользователь возобновляет работу вашего приложения, он начинает работу с того места, где остановился, без перерыва. Эта кнопка выхода узурпирует власть менеджера активности, потенциально вызывая проблемы с автоматически управляемым жизненным циклом программы для Android.
источник
Это будет работать для всех версий Android. Где
IntentCompat
класс добавлен в библиотеку поддержки Android.источник
IntentCompat.FLAG_ACTIVITY_CLEAR_TASK
не распознается, используйтеIntent
вместоIntentCompat
.Используйте следующее для деятельности
убрать флаг CLEAR_TASK для использования фрагмента.
Я надеюсь, что это может использовать для некоторых людей.
источник
Я думаю, что я опоздал, но есть простой и короткий ответ. В Activity есть метод finishAffinity (), который завершает текущее действие и все родительские действия, но работает только в Android 4.1 или новее.
Для API 16+ используйте
finishAffinity();
Для ниже 16, используйте
ActivityCompat.finishAffinity(YourActivity.this);
Надеюсь, поможет!
источник
С сайта developer.android.com :
Завершите это действие, а также все действия непосредственно под ним в текущей задаче, которые имеют ту же привязку. Это обычно используется, когда приложение может быть запущено для другой задачи (например, из ACTION_VIEW типа контента, который он понимает), и пользователь использовал навигацию вверх для переключения из текущей задачи и в свою собственную задачу. В этом случае, если пользователь перешел к каким-либо другим действиям второго приложения, все они должны быть удалены из исходной задачи как часть переключения задачи.
Обратите внимание, что это завершение не позволяет вам доставлять результаты к предыдущему действию, и будет выдано исключение, если вы попытаетесь это сделать.
источник
На заметку, полезно знать
Этот ответ работает ( https://stackoverflow.com/a/13468685/7034327 )
тогда как это не работает
.setFlags()
заменяет любые предыдущие флаги и не добавляет новые флаги, пока.addFlags()
делает.Так что это тоже будет работать
источник
Если ваше приложение имеет минимальную версию SDK 16, то вы можете использовать finishAffinity ()
Завершите это действие, а также все действия непосредственно под ним в текущей задаче, которые имеют ту же привязку.
Для меня это работа. На экране Top Payment удалите все бэк-стеки,
http://developer.android.com/reference/android/app/Activity.html#finishAffinity%28%29
источник
Решение, которое я реализовал для этого (я думаю, что где-то нашел его в Stack Overflow, но я не помню, так что спасибо тому, кто сделал это в первую очередь):
Из любой вашей деятельности сделайте это:
Затем в вашей LoginActivity перезаписать onKeyDown:
источник
Для кнопки выхода из системы на последнем экране приложения используйте этот код на слушателе кнопки выхода из системы, чтобы завершить все открытые предыдущие действия, и ваша проблема решена.
источник
источник
setFlags
заменит все предыдущие, поэтому последнийsetFlags
действителен, предыдущие заменяются. Так что вам не нужно звонитьi1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
у меня есть та же проблема, которую вы можете использовать
IntentCompat
, как это:этот код работает для меня.
Android api 17
источник
В моем случае я использую
finishAffinity()
функцию в последнем действии как:Надеюсь, это будет полезно.
источник
вместо использования
finish()
просто использоватьfinishAffinity();
источник
Войти-> Главный экран-> Экран 1-> Экран 2-> Экран 3-> Экран 4-> Экран 5
на экране 4 (или любой другой) ->
систочник
для API> = 15 до API 23 простое решение.
источник
Если вы используете
startActivityForResult()
в своих предыдущих действиях, просто переопределитеOnActivityResult()
и вызовитеfinish();
метод внутри него во всех действиях .. Это сделает работу ...источник
startActivity
только.onActivityResult
каждый вид деятельности. Я выполнил предложение DArkO и достиг своей цели и благодарю за помощь.Когда пользователь нажмет на кнопку выхода, напишите следующий код:
А также, когда после входа в систему, если вы вызываете новую деятельность, не используйте finish ();
источник
Проще говоря, когда вы выходите из экрана входа в систему, а не после завершения экрана входа в систему.
И затем во всех последующих действиях используйте это для выхода из системы:
Работает отлично.
источник
Если вы вошли в систему пользователя
screen 1
и оттуда вы переходите на другие экраны, используйтеисточник
onKeyDown
иonBackPressed
(илиonKeyDown
, если вы хотите поддерживать версии Android <2.0) в каждом из ваших действий (кроме входа в систему), иstartActivity(login)
там, как показано выше.Я нашел этот путь, он очистит всю историю и выйдет
источник
Я думаю, что я опоздал, но есть простой и короткий ответ. В Activity есть метод finishAffinity (), который завершает текущее действие и все родительские действия, но работает только в Android 4.1 или новее.
Для API 16+ используйте
finishAffinity ();
Для ниже 16, используйте
ActivityCompat.finishAffinity (YourActivity.this);
Надеюсь, поможет!
shareedit ответил 27 мая '18 в 8:03
Акшай Тару
источник
Я нашел это решение для работы на любом устройстве, несмотря на уровень API (даже для <11)
источник
Лучший способ закрыть все предыдущие действия и очистить память
источник
источник