Очистить стек действий перед запуском другого действия - PullRequest
2 голосов
/ 17 октября 2011

Привет (мой первый вопрос здесь; -)

Возможно, есть похожие вопросы, но ни один из них, похоже, не отвечает на мой вопрос или не дает мне реального решения ...


Проблема
A (root) запускается B.B может начать другие действия.A решает закрыть стек (потеря сетевого подключения) и запустить C.Похоже, что это радикальное решение, но пользователь может ожидать этого, и это действительно имеет смысл в этом случае ...

Вопрос
Как это сделать?Я ожидал бы использовать определенный флаг или просто назвать что-то вроде dismissStack.Но я не могу найти решение right (см. Исследование ниже).

Research
Я прочитал много документации, но доступные флаги не даютсоответствовать моим потребностям (или я не правильно понял).Другие ответы там говорят мне помнить начатые действия (например, в массиве) и заканчивать их при необходимости.Но это кажется мне грязным, и почему-то я не могу принять это как правильное решение.Надеюсь, что-то должно быть чище?!
(Хранение стека кажется мне даже неправильным. Ваше приложение может быть убито системой, поэтому ваши статические данные, но ваша история будут загружены снова при запуске.сохранить сохраненный стек. Это становится еще грязнее ...)

Обновление
Мой код и то, что я пробовал (абстрагировано):

// in A
startActivityForResult(new Intent(this, B.class), REQUEST_B);

// network fail in A
// setting any flags on C has no influence
startActivityForResult(new Intent(this, C.class), REQUEST_C);

( FLAG_ACTIVITY_CLEAR_TOP не является решением, пожалуйста, прочитайте документацию ...)

Я нажимаю Назад на C, и B все еще появляется и остается неподвижнымтам ...

Я могу удалить активность, позвонив по номеру finishActivity(REQUEST_B).Но когда B начал другое действие D, оно все равно всплывет, если я нажму Back на C позже.B ушел, но D все еще там ...


Я уверен, что есть кое-что, что я еще не понял или просто пропустил.Может ли кто-нибудь дать мне подсказку или одобрить мое исследование, если оно действительно будет таким ...

Ответы [ 3 ]

1 голос
/ 17 октября 2011

Я думаю, вы ищете флаг FLAG_ACTIVITY_CLEAR_TOP , который будет использоваться с вашими намерениями.

Из документации по ссылке выше приведен пример:

Например, рассмотрим задачу, состоящую из действий: A, B, C, D. Если D вызывает startActivity () с намерением, которое разрешается к компоненту действия B, то C и D будут завершены, а B получитзаданное намерение, в результате чего стек теперь равен: A, B.

Подробнее о задачах и Backstack в Android можно узнать по адресу по этой ссылке в Документах разработчика Android

0 голосов
/ 12 ноября 2012

Вы можете использовать флаги для новой задачи и очистить задачу, чтобы очистить все предыдущие действия из стека

i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
0 голосов
/ 18 октября 2011

Это то, что я получил до сих пор, и это работает довольно хорошо:

Используйте startActivityForResult. Создайте фиктивный код запроса, если вам на самом деле не нужно ждать результата. Затем делайте это в onDestroy каждого занятия.

if (isFinishing()) {
    finishActivity(REQUEST_CODE);
}

Например: у вас в стеке A, B, C, D, вызовите finishActivity(REQUEST_B) из A, это вызовет onDestroy цепочку вызовов, поэтому B убивает C и C убивает D.


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

Я все еще надеюсь, что есть более чистый путь ...

...