Стек истории Android - возвращение более чем на один шаг - PullRequest
2 голосов
/ 11 декабря 2011

Вот сценарий:

  1. В действии A У меня есть опция "публикация в Twitter", которая вызывает действие B, которое выполняет публикацию и возвращает к A, выполнив Activity#finish(), и поток A->B->A
  2. Однако, если я не вошел в Twitter, то действие B вызывает в браузере страницу OAuth для мобильных устройств Twitter. Затем браузер перенаправляет пользователя обратно на B. Однако, когда B закончен, и я звоню Activity#finish(), я возвращаюсь обратно на страницу входа в браузер, что ожидается, поскольку стек теперь A->B->browser->B.

Как мне сделать 3 шага назад вместо одного? Это вообще возможно? Я не хочу звонить A заново, так как, по крайней мере, я потеряю позицию списка

1 Ответ

2 голосов
/ 13 декабря 2011

Вы можете сделать это с помощью FLAG_ACTIVITY_CLEAR_TOP и FLAG_ACTIVITY_SINGLE_TOP .

Вам необходимо запустить A в качестве нового намерения, но установить эти два флага перед вызовом startActivity

Очистить вершину приводит к удалению всех действий в верхней части A.

Одиночная вершина приводит к тому, что намерение доставляется методу onNewIntent A, а не уничтожает и воссоздает A.

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

Если установлено, и запускаемое действие уже выполняется в текущей задаче, то вместо запуска нового экземпляра этого действия все остальные действия поверхоно будет закрыто, и это намерение будет доставлено (теперь уже сверху) старому действию как новое намерение.Например, рассмотрим задачу, состоящую из действий: A, B, C, D. Если D вызывает startActivity () с намерением, которое разрешается к компоненту действия B, то C и D будут завершены, а B получит данное намерениев результате получается стек: A, B. Текущий запущенный экземпляр действия B в вышеприведенном примере либо получит новое намерение, которое вы начинаете здесь, в его методе onNewIntent (), либо сам завершится и перезапустится с новым намерением,Если он объявил свой режим запуска «множественным» (по умолчанию), и вы не установили FLAG_ACTIVITY_SINGLE_TOP в том же самом намерении, то он будет завершен и создан заново;для всех других режимов запуска или если установлен FLAG_ACTIVITY_SINGLE_TOP, то это намерение будет доставлено в onNewIntent () текущего экземпляра.Этот режим запуска также можно использовать для достижения хорошего эффекта в сочетании с FLAG_ACTIVITY_NEW_TASK: если он используется для запуска корневого действия задачи, он выведет любой запущенный в данный момент экземпляр этой задачи на передний план, а затем очистит его до корневого состояния.Это особенно полезно, например, при запуске действия из диспетчера уведомлений.См. Задачи и Back Stack для получения дополнительной информации о задачах.

...