Как очистить стек мероприятий Android?
-
10-10-2019 - |
Вопрос
У меня есть приложение с несколькими действиями в Android, и я хочу, чтобы пользователь мог выйти из системы, нажав кнопку меню. Проблема у меня в том, что
А) 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.
Решение
В своем входе в систему переопределите кнопку задней части, поэтому оно скрывает ваше приложение вместо завершения деятельности:
@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 -> b -> c -> d, когда я называю начальную деятельность E в стеке, у меня сейчас -> 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);
Если мы используем этот код для запуска активности входа в систему (A):
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
Деятельность должна быть в стеке действий, в противном случае эти флаги не будут иметь никакого эффекта.
Если мы используем Finish () в активности входа в систему (A), после запуска активности (b) (чтобы не возвращаться к A от b), активность A (логин) не будет в стеке. Точно так же происходит, когда деятельность в логине имеет «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);
}