Очистить весь стек истории и начать новое действие на Android

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

Ситуация

У меня есть стек активности, который либо идет A-> B-> C, либо B-> C (экран A выбирает токен пользователя, но многие пользователи имеют только один токен).

На экране C пользователь может предпринять действие, которое делает экран B недействительным, поэтому приложение хочет перенести их на экран A, независимо от того, находится ли он уже в стеке. Тогда экран А должен быть единственным элементом в стеке в моем приложении.

Примечания

Есть много других подобных вопросов, но я не нашел ничего, что отвечало бы на этот точный вопрос. Я попытался вызвать getParent (). Finish () - это всегда приводит к исключению нулевого указателя. FLAG_ACTIVITY_CLEAR_TOP работает, только если действие уже находится в стеке.

312
задан Marian Paździoch 13 August 2014 в 22:18
поделиться

1 ответ

Не меняйте стек. Кнопка возврата Android должна работать как в веб-браузере.

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

  • Сделайте свои действия singleTask , добавив их в AndroidManifest Пример:

     
    
    
    
  • Расширьте Приложение , которое будет содержать логику того, куда идти.

Пример:

public class DontHackAndroidLikeThis extends Application {

  private Stack<Activity> classes = new Stack<Activity>();

  public Activity getBackActivity() {
    return classes.pop();
  }

  public void addBackActivity(Activity activity) {
    classes.push(activity);
  }
}

От A до B:

DontHackAndroidLikeThis app = (DontHackAndroidLikeThis) getApplication();
app.addBackActivity(A.class); 
startActivity(this, B.class);

От B до C:

DontHackAndroidLikeThis app = (DontHackAndroidLikeThis) getApplication();
app.addBackActivity(B.class); 
startActivity(this, C.class);

В C:

If ( shouldNotGoBackToB() ) {
  DontHackAndroidLikeThis app = (DontHackAndroidLikeThis) getApplication();
  app.pop();
}

и обработайте кнопку возврата, чтобы вытолкнуть () из стека.

Опять же, не надо этого делать :)

12
ответ дан 23 November 2019 в 01:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: