Как очистить Android стек деятельности?
у меня есть приложение с несколькими видами деятельности в Android и я хочу, чтобы пользователь мог войти, нажав кнопку меню. Проблема у меня в том, что
A) Android не позволяет вам прекратить работу приложения и
Б) даже когда я отправляю пользователя в LoginActivity
снова они всегда могут нажать назад и сразу же вернуться к предыдущей деятельности, в которой они были.
Я уже пытался запустить действие с двумя следующими флагами:
Intent intent = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
Я тоже пытался с каждым из них сами по себе.
Я тоже пробовал звонить finish()
после startActivity(intent)
как я читал в другом сайте StackOverflow
вопрос.
10 ответов:
в вашей активности входа переопределите кнопку "назад", чтобы она скрывала ваше приложение вместо завершения действия:
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { moveTaskToBack(true); return true; } return super.onKeyDown(keyCode, event); }
также обязательно установите android: alwaysRetainTaskState="true" в корневой активности, поэтому Android не очищает ваш стек (включая активность входа) после 30 минут бездействия от пользователя.
затем просто вызовите finish (), когда есть успешный вход в систему.
Это должно быть побитовым или вы в конечном итоге перезаписываете более ранний флаг.
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
вот так:
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
по состоянию на Вакка на удаление действия из стека истории...
добавить
android:noHistory="true"
атрибут<activity>
наAndroidManifest.xml
такой:<activity android:name=".MyActivity" android:noHistory="true"> </activity>
Если вы используете
Android API 11
или выше, вы можете использовать следующий код, чтобы очистить стек.intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
это не очистит ваш стек активности обратно.
даже после выполнения всего вышеприведенного ответа, когда я нажал кнопку "назад", он показал последнюю активность за секунду до закрытия приложения.
вот что я сделал:
@Override public void onBackPressed() { Intent startMain = new Intent(Intent.ACTION_MAIN); startMain.addCategory(Intent.CATEGORY_HOME); startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(startMain); }
теперь мое приложение выходит на задний пресс :) без каких-либо хлопот.
задание
Intent.FLAG_ACTIVITY_CLEAR_TOP
работал для меня в очень похожем случае, где я не установилIntent.FLAG_ACTIVITY_NEW_TASK
флаг. Вы пробовали без него?
эта работа для меня :)
Intent main = new Intent(this, A_Activity.class); main.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(main); Intent tool = new Intent(this, B_Activity.class); startActivity(tool); finish();
где A-моя корневая активность, например
У меня есть действия A - > B - > C - > D Когда я вызываю start activity E в стеке, у меня теперь есть A - > E
Я не знаю, хорошо ли это :) но работает.
Intent intent = new Intent(this, LoginActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent);
напишите это и обратите внимание:
LoginActivity
должен быть запущен сначала как пусковая установка иЕсли вы пишете какие-либо режимы запуска флаги перезаписываются своей целью, поэтому удалите
launchermode
и попробуйте вы обязательно получите его
попробуй такое
Intent intent = new Intent(this, MainActivity.class); intent.addFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
Если мы используем этот код для запуска активности входа (а):
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
действие должно быть в стеке действий, иначе эти флаги не будут иметь никакого эффекта.
Если мы используем finish () в login activity (A), после запуска activity (B) (чтобы избежать возврата к A из B), activity A (Login) не будет в стеке. Точно так же происходит, когда действие входа имеет атрибут "noHistory".
Итак, решение для меня было смесью другие ответы:
этот код входит в действие B, чтобы избежать возврата к активности входа:
@Override public void onBackPressed() { moveTaskToBack(true); super.onBackPressed(); }
и этот код входит в действие, которое вызывает функцию выхода из системы:
public static void logout() { Intent intent = new Intent(activity, LoginMain.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); }