Как очистить 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 52

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);
}