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

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

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

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

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

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

благодаря

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

    Да, посмотрите на Intent.FLAG_ACTIVITY_NO_HISTORY .

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

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

      ... 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) нити.

    Один из способов, с помощью которого работает 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 этого goBackPressed код goBackPressed в свой class ActivitySplashScreenSignUp .

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

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

     intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 

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

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

    Я знаю, что я опаздываю на это (прошло два года с тех пор, как был задан вопрос), но я сделал это, перехватив нажатие кнопки «Назад». Вместо того, чтобы проверять конкретные действия, я просто просматриваю счет, а если он меньше 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's more than two deep (initial screen and home screen) //If it's more than two deep, then let the app proccess the press ActivityManager am = (ActivityManager)this.getSystemService(Activity.ACTIVITY_SERVICE); List 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(); } } 

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

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

     android:noHistory="true"  

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

     finish() 

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

    для 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); 

    Просто назовите this.finish () до startActivity (намерения), как this-

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

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

    SplashActivity -> AuthActivity -> DashActivity

     if (!sessionManager.isLoggedIn()) { Intent intent = new Intent(context, AuthActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); context.startActivity(intent); finish(); } else { Intent intent = new Intent(context, DashActivity.class); context.startActivity(intent); finish(); } 

    Ключевым моментом здесь является использование intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); для посреднической Activity . Как только эта средняя ссылка сломана, DashActivity будет первым и последним в стеке.

    android:noHistory="true" – это плохое решение, так как оно вызывает проблемы при использовании Activity в качестве обратного вызова, например onActivityResult . Это рекомендуемое решение и должно быть принято.

    Уже слишком поздно, но надеюсь, что это поможет. Большинство ответов не указывают на правильное направление. Для такой вещи есть два простых флага.

     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 

    Из Android-документов:

    public static final int FLAG_ACTIVITY_CLEAR_TASK Добавлен в уровень API 11

     If set in an Intent passed to Context.startActivity(), this flag will cause any existing task that would be associated with the 

    чтобы очистить до начала действия. То есть, деятельность становится новым корнем пустой задачи, и все старые действия завершены. Это можно использовать только совместно с FLAG_ACTIVITY_NEW_TASK.

    Попробуй это:

    intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)

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

    Interesting Posts

    Как закрепить два (или более) DataFrame в Spark

    Аргумент командной строки для запуска в качестве другого пользователя в Windows?

    Могу ли я принудительно использовать всю службу индексирования Windows?

    Как подключиться к этому локальному хосту с другого компьютера в той же сети?

    Композитный ключ с EF 4.1 Code First

    Является ли LUKS / cryptsetup `hddname` (или` name`) просто произвольной меткой, используемой во время сеанса

    Как предотвратить перемещение дополнительного пространства дисплея с места для ноутбука в macOS?

    Может ли основной метод в Java возвращать что-то?

    Какой самый простой способ получить текущий день недели в Android?

    Как я могу разделить два целых числа, чтобы получить двойной?

    dplyr :: select вызовы функции с помощью MASS :: select

    jackson – десериализовать с помощью универсального classа

    Соглашения Java: использовать getters / setters внутри classа?

    Почему избыточная квалификация, поддерживаемая компилятором, является законной?

    Алгоритм: эффективный способ удаления повторяющихся целых чисел из массива

    Давайте будем гением компьютера.