Как вывести деятельность на передний план (верх стека)? - PullRequest
75 голосов
/ 09 февраля 2010

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

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

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

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

Ответы [ 9 ]

95 голосов
/ 10 февраля 2010

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

55 голосов
/ 12 июля 2010

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

Например:

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

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

23 голосов
/ 13 февраля 2012

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

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;
}
9 голосов
/ 16 октября 2012

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 голосов
/ 10 февраля 2010

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

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

2 голосов
/ 15 января 2015

i.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

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

1 голос
/ 10 февраля 2010

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

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

0 голосов
/ 12 июня 2015

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

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

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

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

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

0 голосов
/ 19 июня 2014

если вы используете «Облачное сообщение Google» для получения 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());

Чао!

...