Как очистить стек Android деятельности?

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

A) Android не позволяет завершить работу приложения и
B) даже когда я отправляю пользователя в 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 должен быть запущен сначала как Launcher и

Если вы пишете какие-либо режимы запуска, флаги перезаписываются, поэтому удалите 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);
}