2011-02-11 2 views
15

Мой стек активности A1 B A2, с A2 вверху.Переведите операцию на фронт, используя FLAG_ACTIVITY_REORDER_TO_FRONT

A1 и A2 являются экземплярами одного и того же вида деятельности. A. Теперь в A2 я хочу, чтобы A2 выходил и выдвигал A1 вперед, поэтому последний стек должен быть B A1. Как его реализовать?

Мой текущий код, A2 executs является:

 finish(); 

     intent = new Intent(this, A.class); 
     intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP); 
     startActivity(intent); 

Приведенный выше код привел B на фронт, поэтому окончательный стек A1 B, который не то, что я ожидал.

Любая идея?

Спасибо.

ответ

13

Невозможно выполнить то, что вы хотите, используя флаги Intent.

Причина в том, что работает FLAG_ACTIVITY_REORDER_TO_FRONT. Когда вы используете этот флаг, Android ищет экземпляр требуемой активности в вашем стеке активности, начиная с передней части стека и сканируя до тех пор, пока он не достигнет корня/задней части стека. Как только он находит экземпляр указанного действия, он выводит его на передний план (т. Е. Если есть несколько экземпляров указанного действия, он будет выводить на передний план самый последний экземпляр).

В вашем случае стек деятельности выглядит следующим образом:

A1, B, A2 (front of task) 

При попытке реорганизовать свою активность А, Android находит экземпляр A2 первым и упорядочивает, что на переднюю части задачи. Конечно, это было уже впереди задачи, поэтому на самом деле это ничего не делает.

Конечно, вы уже вызвали finish(), и вы попробовали (с помощью FLAG_ACTIVITY_PREVIOUS_IS_TOP) сообщить Android, что он не должен учитывать текущую активность при принятии решения о том, что делать, но это все игнорируется. Android видит A2 как самый последний экземпляр активности A и переустанавливает его на передний план. Затем A2 завершается, и действие B становится перед задачей. Пользователь видит «B» и стек активность:

A1, B (front of task) 

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

+4

Я сделал новый класс, расширив класс А. – Kai

+0

Спасибо большое за хорошее объяснение – Simcha

-4

Вы вызываете finish(), прежде чем вы вызываете startActivity. Как вы думаете, что он должен начать свою деятельность после того, как она уже закончена?

Кроме того, как предполагается знать, какой экземпляр A должен вывести на передний план?

+7

Вы можете вызвать 'finish()', а затем продолжить работу, включая запуск других действий. В этом нет ничего плохого. Вызов 'finish()' фактически не заканчивает действие немедленно, он просто сообщает андроиду, что вы хотите, чтобы действие завершилось. –

0

В моем приложении у меня такая же ситуация.

Мое решение было создать невидимую Start-вверх деятельности, X, который перенаправляет на

Таким образом, ваш стек будет выглядеть следующим образом:

X A1 B A2

В любой точке I нужно вернуться к A1, перемотать назад на X (используя FLAG_ACIVITY_CLEAR_TOP), который, в свою очередь, запустит A.

Смежные вопросы