В моем приложении есть уведомления, которые, очевидно, без каких-либо флагов, каждый раз запускают новое действие, поэтому я получаю несколько одинаковых действий, выполняемых друг над другом, что совершенно неправильно.
Что я хочу, так это вывести действие, указанное в ожидающих уведомлениях о намерении, на передний план, если оно уже запущено, в противном случае запустить его.
Пока что намерение / ожидающее намерение для этого уведомления, которое у меня есть,
private static PendingIntent prepareIntent(Context context) {
Intent intent = new Intent(context, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
и, как ни странно, иногда это работает, иногда нет ... Мне кажется, я уже пробовал каждую комбинацию флагов.
onNewIntent
и установка флагов)Я думаю, что лучший способ сделать это простым способом - запустить действие в обычном режиме, но установить это действие в манифесте с помощью
singleInstance
свойства. Таким образом вы практически решаете обе проблемы, которые возникают у вас прямо сейчас, постоянно выводя активность на передний план и позволяя ОС автоматически создавать новую, если никаких действий не существует, или выводить на передний план текущую существующую активность (благодаряsingleInstance
свойство).Таким образом действие объявляется как отдельный экземпляр:
Также, чтобы избежать прерывистой анимации при запуске через singleInstance, вы можете вместо этого использовать singleTask, оба очень похожи, но разница объясняется здесь в соответствии с документацией Google:
Надеюсь это поможет.
С уважением!
источник
Я думаю, что вам нужно больше
singleTop
Activity
, чем вsingleTask
илиsingleInstance
.То, что говорится в документации , идеально соответствует вашим потребностям:
Вдобавок ко всему (это не каламбур), у меня были точно такие же потребности, как и у вас. Я протестировал все
launchMode
флаги, чтобы выяснить, как они на самом деле ведут себя на практике, и в результате оказалсяsingleTop
лучшим для этого: без странной анимации, приложение отображается один раз в списке последних приложений (в отличие от него,singleInstance
которое отображает его дважды, потому что оно не отображается t позволяет любому другомуActivity
быть частью своей задачи), и вести себя должным образом независимо отActivity
того, существует ли цель уже или нет.источник
Это старая ветка, но для всех, кто все еще ищет ответ, вот мое решение. Это чисто код, без настроек манифеста:
Здесь FLAG_ACTIVITY_SINGLE_TOP открывает существующее действие, если оно находится на вершине стека задач. Если он находится не наверху, а внутри стека, FLAG_ACTIVITY_CLEAR_TOP удалит все действия поверх целевого действия и покажет его. Если активность отсутствует в стеке задач, будет создана новая. Следует упомянуть критически важный момент - второй параметр PendingIntent.getActivity (), т.е. requestCode должен иметь ненулевое значение (я даже назвал его NON_ZERO_REQUEST_CODE в моем фрагменте), иначе эти флаги намерений не будут работать. Понятия не имею, почему это так. Флаг FLAG_ACTIVITY_SINGLE_TOP взаимозаменяем с android: launchMode = "singleTop" в теге активности в манифесте.
источник
Я знаю, что он старый, но ничего из вышеперечисленного не подходило для моего приложения.
Не меняя манифестов и других конфигураций, вот код, чтобы вернуть ваше приложение на передний план или открыть его, когда оно закрыто.
источник
Я попробовал это, и это сработало, хотя среда IDE жаловалась на код
источник
Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
не является допустимым для флагаPendingINtent.getActivity
Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
не является допустимым флагом при использовании в качествеPendingIntent
. Или, может быть, вы имели в виду, что это недопустимо для передачи вgetActivity
метод, но допустимо для использования в качествеIntent
флага, который затем используется какPendingIntent
?Поскольку вы говорите, что хотите начать свою деятельность, если она еще не началась, возможно, вы не против перезапустить ее. Я также протестировал массу предложений и комбинаций флагов для намерения, это всегда будет выдвигать нужную вам активность на передний план, хотя при этом не сохраняется какое-либо состояние, ранее связанное с ней.
Только API11 +.
источник
У меня была аналогичная проблема после добавления уведомлений, найденных на сайте обучения Android . Ни один из других ответов здесь не сработал для меня, однако этот ответ сработал для меня. Резюме:
источник