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

В 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.

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


person user256239    schedule 09.02.2010    source источник


Ответы (9)


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

person Community    schedule 10.02.2010
comment
Я думаю, что это должно быть FLAG_ACTIVITY_SINGLE_TOP. - person ; 17.05.2012
comment
@ user942821 FLAG_ACTIVITY_SINGLE_TOP здесь не поможет. Когда ActivityC находится на вершине стека и вызывает startActivity() для запуска ActivityA, даже если вы установите FLAG_ACTIVITY_SINGLE_TOP, все равно будет создан новый экземпляр ActivityA. FLAG_ACTIVITY_SINGLE_TOP предотвращает создание нового экземпляра, только если вы пытаетесь запустить действие, которое уже находится на вершине стека. В этом случае ActivityA не находится на вершине стека, поэтому Android создает новый экземпляр. - person David Wasser; 21.03.2013
comment
Потрясающий! Используется (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP) для очистки любой истории после заданного Activity. - person shkschneider; 09.06.2015
comment
FLAG_ACTIVITY_REORDER_TO_FRONT игнорируется, если вы также укажете FLAG_ACTIVITY_CLEAR_TOP. Проверьте документацию. - person Kris Subramanian; 28.07.2015
comment
намерение.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP); Это будет нормально работать, если вы хотите вывести свою активность на передний план с сеансом пользователя, если он уже находится поверх заднего стека, но не впереди. - person Hassan Jamil; 15.11.2016
comment
переупорядочивает ли передний план newIntent в onNewIntent ? - person Bhargav; 09.06.2017

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

Например:

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

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

person greg7gkb    schedule 12.07.2010
comment
Большое спасибо за этот кусок кода. Я потратил часы, пытаясь заставить это работать должным образом. - person PakitoV; 14.11.2011
comment
или без ComponentName и setComponent, но с новым намерением (это, MyMainActivity.class) - person Tima; 17.11.2011
comment
Я предполагаю, что в 2010 году документации и стандартов было мало, это неправильный ответ. - person ashishduh; 08.08.2014
comment
Странно, поскольку это было единственное, что сработало для меня; установка флагов не работала и всегда воссоздавала активность. - person Steven Huang; 10.03.2015
comment
@DavidWasser, где в переполнении стека написано, что сообщество должно решить чью-то проблему? сообщество решает проблемы сообщества. если это просто операционная проблема, то вопрос следует удалить как слишком локализованный. - person Boris Treukhov; 29.01.2016
comment
@BorisTreukhov Я думаю, вы упускаете суть. Это ответ, который не решает заданный вопрос. Я не говорю, что ответ бесполезен, он просто не отвечает на заданный вопрос. На мой взгляд, такая ситуация наносит ущерб сообществу. Что обычно происходит, так это то, что у какого-то члена сообщества есть проблема, и он ищет в SO вопрос, соответствующий проблеме этого члена. Затем участник просматривает принятые и / или получившие большое количество голосов ответы и предполагает, что, поскольку эти ответы решили исходный вопрос ОП, они, скорее всего, решат его / ее проблему. - person David Wasser; 29.01.2016
comment
@BorisTreukhov В этом случае сообщество оказывает своим членам медвежью услугу, голосуя за ответ, который на самом деле не решает исходную проблему. Если этот ответ такой замечательный, то кто-то должен найти (или опубликовать) проблему, которую он решает, а затем предоставить это замечательное решение в качестве ответа. Не знаю, как вы, а я прихожу в StackOverflow, чтобы решать проблемы людей. Я полагаю, что если у разработчика есть проблема, которую я могу решить, велика вероятность, что еще дюжина (или сотня, или тысяча) разработчиков также столкнется с этой проблемой в будущем. Иди разберись. - person David Wasser; 29.01.2016
comment
Когда я читаю этот ответ и комментарии, становится ясно, что у нас возникло недопонимание. Исходный вопрос спрашивает о том, как переставить Activity в стеке задач. OP четко заявляет, что он хочет переместить ActivityA из нижней части стека в верхнюю часть стека (т. е. он хочет переупорядочить ActivityA в начало стека задач). Этот ответ не сделает этого. Этот ответ является ответом на вопрос Как я могу перевести свое приложение (стек задач) из фона на передний план? Это совершенно другой вопрос, чем исходный вопрос ОП. - person David Wasser; 29.01.2016
comment
Я пришел к этому вопросу, потому что мне нужно решение, которое выводит последнюю активность приложения из намерения уведомления службы переднего плана - в моем случае FLAG_ACTIVITY_REORDER_TO_FRONT не работал. Вывести активность на передний план не так уж и сложно. Google хорошо справляется с индексацией, в то время как внутренний поиск SO бесполезен - но у любого поиска с помощью машинного обучения с классификацией есть эта проблема - когда я ищу слово королева, я готов увидеть фотографии Фредди Меркьюри и королевы Елизаветы. - person Boris Treukhov; 30.01.2016
comment
На SO более 10 миллионов вопросов, я не верю, что может существовать единая идеальная классификация, и из-за рейтинга страницы, естественно, некоторые вопросы получают гораздо более высокий рейтинг, чем другие, и отображаются, когда я ищу свою проблему, и это здорово экономит время, что Я нашел решение, не выбирая случайным образом десятки вопросов и ответов, угадывая, какое ключевое слово они должны содержать, как это было в поисковых системах только по ключевым словам. Когда кто-то пытается быть действительно полезным, он публикует ответ на вопрос, который может быть полезен будущим посетителям, которые будут использовать поиск. - person Boris Treukhov; 30.01.2016
comment
ИМХО 1) вы не можете эффективно (повторно) классифицировать 10 миллионов вопросов 2) никакая строгая классификация не может быть на 100% полезной для всех 3) я все равно использую поиск с помощью машинного обучения, который выполняет свою собственную классификацию 4) единственный способ помочь компьютерному поиску заключается в использовании тегов. Конечно, я не хочу видеть ответ веб-просмотра iOS на вопрос веб-просмотра Android, и в этом случае теги верны, поэтому любые отрицательные голоса вредны ИМХО 5) ТАК это не форум - оставайтесь в теме / помогите оператору с его очень конкретным / домашним заданием правила задачи смягчены - person Boris Treukhov; 30.01.2016
comment
Также кнопка «за» говорит: «Этот ответ полезен, а не этот ответ полезен для оператора» - он / она уже имеет отметку о принятии для этой ситуации. Очевидно, я не знаю, что полезно для оператора, и, ИМХО, отрицательные ответы, основанные на моем предположении, что полезно для оператора, неверно. - person Boris Treukhov; 30.01.2016
comment
наконец я нашел решение - person user924; 13.09.2020

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

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;
}
person Jan-Terje Sørensen    schedule 13.02.2012

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

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

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

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

person Al.    schedule 09.02.2010

i.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

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

person sujith s    schedule 15.01.2015

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

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

person Segfault    schedule 10.02.2010

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

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

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

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

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

person sakis kaliakoudas    schedule 12.06.2015

если вы используете «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());

Чао!

person Community    schedule 19.06.2014