Перенести активность на фронт, используя FLAG_ACTIVITY_REORDER_TO_FRONT

Мой стек активности - A1 B A2, с A2 вверху.

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

Мой текущий код, который выполняет A2:

        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, чего я не ожидал.

Любая идея?

Спасибо.

Ответы

Ответ 1

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

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

В вашем случае стек активности выглядит так:

A1, B, A2 (front of task)

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

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

A1, B (front of task)

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

Ответ 2

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

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

Итак, ваш стек будет выглядеть так:

X A1 B A2

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

Ответ 3

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

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