Вопрос

У меня есть приложение с несколькими действиями в 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);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top