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


91

В Android я определил действие ExampleActivity.

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

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

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

Ответы:


109

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


3
Думаю, это должно быть FLAG_ACTIVITY_SINGLE_TOP .

26
@ user942821 FLAG_ACTIVITY_SINGLE_TOPздесь не поможет. Когда ActivityC находится наверху стека и вызывает startActivity()ActivityA, даже если вы установили, FLAG_ACTIVITY_SINGLE_TOPон все равно создаст новый экземпляр ActivityA. FLAG_ACTIVITY_SINGLE_TOPпредотвращает создание нового экземпляра только в том случае, если вы пытаетесь запустить действие, которое уже находится на вершине стека . В этом случае ActivityA не находится на вершине стека, поэтому Android создает новый экземпляр.
Дэвид Вассер

6
Потрясающие! Используется (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP)для очистки любой истории после заданного Activity.
shkschneider 09

10
FLAG_ACTIVITY_REORDER_TO_FRONT игнорируется, если вы также указываете FLAG_ACTIVITY_CLEAR_TOP. Проверить документацию.
Kris Subramanian

3
intent.addFlags (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP); Это будет работать нормально, если вы хотите вывести свою активность на передний план с пользовательским сеансом, если он уже находится на вершине backstack, но не на переднем плане.
Hassan Jamil

64

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

Например:

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

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


2
Большое спасибо за этот фрагмент кода. Я потратил впустую часы, пытаясь заставить это работать должным образом.
PakitoV

3
или без ComponentName и setComponent, но с новым Intent (this, MyMainActivity.class)
Tima

3
Как ни странно, это было единственное, что у меня сработало; установка флагов не работала и всегда воссоздала действие.
Стивен Хуанг,

5
Когда я прочитал этот ответ и комментарии, стало ясно, что у нас возникло недопонимание. Исходный вопрос заключается в том, как изменить порядок Activityвнутри стека задач. OP четко заявляет, что он хочет перейти ActivityAот нижней части стека к верхней части стека (то есть: он хочет переупорядочить ActivityA в начало стека задач ). Этот ответ не поможет. Этот ответ является ответом на вопрос «Как вывести мое приложение (стек задач) из фона на передний план?» Это совершенно другой вопрос от исходного вопроса OP.
Дэвид Вассер

3
Кроме того, кнопка «За» говорит: «Этот ответ полезен», а не «Этот ответ полезен для оператора» - у него уже есть «отметка принятия» для этой ситуации. Очевидно, я не знаю, что полезно для op, и ответы IMHO на голосование, основанные на моем предположении, что полезно для op, неверны.
Борис Треухов

28

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

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;
}

11

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

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

4

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

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


2

i.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

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


1

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

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


0

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

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

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

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

  3. Действие выводится на вершину стека действий, никаких дубликатов.


-2

если вы используете «Google Cloud Message» для получения push-уведомлений с классом «PendingIntent», следующий код отображает уведомление только на панели действий.

При нажатии на уведомление активность не будет создана, последняя активная активность восстанавливается с сохранением текущего состояния без проблем.

Intent notificationIntent = new Intent(this, ActBase.class); **notificationIntent.setAction(Intent.ACTION_MAIN); notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);** PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_launcher) .setContentTitle("Localtaxi") .setVibrate(vibrate) .setStyle(new NotificationCompat.BigTextStyle().bigText(msg)) .setAutoCancel(true) .setOnlyAlertOnce(true) .setContentText(msg);

mBuilder.setContentIntent(contentIntent);

NotificationManager mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());

Чао!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.