it-swarm.com.ru

Как вывести деятельность на передний план (верх стека)?

В Android я определил активность ExampleActivity.

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

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

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

72
user256239

Вы можете попробовать это FLAG_ACTIVITY_REORDER_TO_FRONT (документ описывает именно то, что вы хотите)

88
Binh Tran

Лучший способ сделать это - использовать то же намерение, что и на главном экране Android - приложение Launcher.

Например:

Intent i = new Intent(this, MyMainActivity.class);
i.setAction(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(i);

Таким образом, любая активность в моем пакете, использованная пользователем в последнее время, снова возвращается на передний план. Я нашел это полезным при использовании PendingIntent моей службы, чтобы вернуть пользователя в мое приложение.

54
greg7gkb

Вот пример кода того, как вы можете это сделать:

Intent intent = getIntent(getApplicationContext(), A.class)

Это обеспечит наличие только одного экземпляра активности в стеке. 

private static Intent getIntent(Context context, Class<?> cls) {
    Intent intent = new Intent(context, cls);
    intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    return intent;
}
21
Jan-Terje Sørensen

FLAG_ACTIVITY_REORDER_TO_FRONT : Если этот параметр установлен в намерении, передаваемом в Context.startActivity (), этот флаг приведет к тому, что запущенное действие будет перенесено в начало стека истории его задачи, если оно уже выполняется.

Intent i = new Intent(context, AActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(i);
7
FunGapApp

Я думаю, что комбинация флагов Intent должна помочь. В частности, Intent.FLAG_ACTIVITY_CLEAR_TOP и Intent.FLAG_ACTIVITY_NEW_TASK.

Добавьте эти флаги в ваше намерение перед вызовом startActvity.

4
Al.

i.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

Примечание. Ваш режим запуска homeactivity должен быть single_task

2
sujith s

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

Я уверен, что вы видели эту страницу, но для для вашего удобства эта ссылка

1
Segfault

Если вы хотите вывести активность на вершину стека при нажатии на уведомление, вам может потребоваться выполнить следующие действия, чтобы заставить FLAG_ACTIVITY_REORDER_TO_FRONT работать:

Решением для меня было сделать широковещательный приемник, который прослушивает широковещательные действия, которые запускает уведомление. Итак, в основном:

  1. Уведомление запускает широковещательное действие с дополнительным названием запускаемого действия.

  2. Получатель широковещательной передачи ловит это при нажатии на уведомление, а затем создает намерение запустить это действие, используя флаг FLAG_ACTIVITY_REORDER_TO_FRONT

  3. Активность выводится на вершину стека активности, без дубликатов.

0
sakis kaliakoudas