Удаление активности из стека истории

Мое приложение показывает активность регистрации при первом запуске приложения, выглядит так:

  • ActivitySplashScreen (добро пожаловать в игру, зарегистрируйтесь в учетной записи?)
  • ActivitySplashScreenSignUp (отлично, заполните эту информацию)
  • ActivityGameMain (основной экран игры)

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

Когда пользователь переходит из действия № 2 в № 3, можно ли полностью стереть # 1 и # 2 из стека истории? Я бы хотел, чтобы, если пользователь находится на # 3 и нажимает кнопку "Назад", они просто переходят на рабочий стол, а не обратно на экран заставки.

Я думаю, что могу выполнить это с помощью задач (т.е. начать новую задачу на # 3), но хотел посмотреть, был ли более простой метод,

Спасибо

Ответ 1

Это можно сделать, установив атрибут android:noHistory в "true" в соответствующие записи <activity> в вашем файле AndroidManifest.xml. Например:

<activity
    android:name=".AnyActivity"
    android:noHistory="true" />

Ответ 2

Вы можете использовать переадресацию для удаления предыдущей активности из стека действий при запуске следующего. Вот пример этого в APIDemos, но в основном все, что вы делаете, вызывает finish() сразу после вызова startActivity().

Ответ 4

Это, вероятно, не идеальный способ сделать это. Если у кого-то есть лучший способ, я буду с нетерпением ждать его реализации. Вот как я выполнил эту конкретную задачу с помощью sdk pre-version-11.

в каждом классе, который вы хотите уйти, когда он очищает время, вам нужно сделать это:

    ... interesting code stuff ...
    Intent i = new Intent(MyActivityThatNeedsToGo.this, NextActivity.class);
    startActivityForResult(i, 0);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == R.string.unwind_stack_result_id) {
        this.setResult(R.string.unwind_stack_result_id);
        this.finish();
    }
}

то тот, который должен установить цепочку попсов из стека, должен просто вызвать это, когда вы хотите его инициировать:

NextActivity.this.setResult(R.string.unwind_stack_result_id);
NextActivity.this.finish();

Затем действия не находятся в стеке!
Помните людей, что вы можете начать деятельность, а затем начать очистку за ней, выполнение не следует ни одному (ui) потоку.

Ответ 5

Один из способов, которым работает pre API 11, - сначала запустить ActivityGameMain, затем в onCreate этого Действия запустите свой ActivitySplashScreen. ActivityGameMain не появится, поскольку вы слишком быстро вызываете startActivity для всплеска.

Затем вы можете очистить стек при запуске ActivityGameMain, установив эти флаги в Intent:

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);

Вы также должны добавить это в ActivitySplashScreen:

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

Итак, чтобы вернуться к этой активности, возврат к ActivityGameMain не вернется.

Я предполагаю, что вы не хотите, чтобы экран заставки снова вернулся, чтобы достичь этого, я предлагаю установить его в noHistory в AndroidManifest.xml. Затем поместите код goBackPressed в свой класс ActivitySplashScreenSignUp.

Однако я нашел несколько способов сломать это. Запустите еще одно приложение из уведомления, пока отображается ActivitySplashScreenSignUp, а задняя история - не reset.

Единственный реальный путь вокруг этого - в API 11:

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

Ответ 6

Я использую этот путь.

Intent i = new Intent(MyOldActivity.this, MyNewActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)
startActivity(i);

Ответ 7

Я знаю, что я опаздываю на это (прошло два года с тех пор, как был задан вопрос), но я сделал это, перехватив кнопку "Назад". Вместо того, чтобы проверять конкретные действия, я просто просматриваю счетчик, и если он меньше 3, он просто отправляет приложение обратно (приостанавливает приложение и возвращает пользователя на все, что было запущено до запуска). Я проверяю менее трех, потому что у меня есть только один экран. Кроме того, я проверяю счет, потому что мое приложение позволяет пользователю вернуться к главному экрану через меню, так что это позволяет им выполнять резервное копирование через другие экраны, как обычно, если в стеке есть действия, отличные от встроенного экрана.

//We want the home screen to behave like the bottom of the activity stack so we do not return to the initial screen
//unless the application has been killed. Users can toggle the session mode with a menu item at all other times.
@Override
public void onBackPressed() {
    //Check the activity stack and see if it more than two deep (initial screen and home screen)
    //If it more than two deep, then let the app proccess the press
    ActivityManager am = (ActivityManager)this.getSystemService(Activity.ACTIVITY_SERVICE);
    List<RunningTaskInfo> tasks = am.getRunningTasks(3); //3 because we have to give it something. This is an arbitrary number
    int activityCount = tasks.get(0).numActivities;

    if (activityCount < 3)
    {
        moveTaskToBack(true);
    }
    else
    {
        super.onBackPressed();
    }
}

Ответ 8

Просто установите noHistory="true" в файле Манифест. Это делает операцию удаленной из задней части.

Ответ 9

для API >= 15 для API 23 другое решение не работает в моем случае. наконец, я получаю этот.

 Intent nextScreen = new Intent(currentActivity.this, MainActivity.class);
 nextScreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
 startActivity(nextScreen);
 ActivityCompat.finishAffinity(currentActivity.this);

Ответ 10

В манифесте вы можете добавить:

android:noHistory="true"

<activity
android:name=".ActivityName"
android:noHistory="true" />

Вы также можете позвонить

finish()

сразу после вызова startActivity (..)

Ответ 11

Просто вызовите this.finish() до начала действия (намерения), как это -

       Intent intent = new Intent(ActivityOne.this, ActivityTwo.class);
        this.finish();
        startActivity(intent);

Ответ 12

Попробуйте следующее:

intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)

это уровень API 1, проверьте ссылку .