Уведомление: активность уже открыта

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

Я думал, что могу сделать это с флагом FLAG_ACTIVITY_BROUGHT_TO_FRONT или FLAG_ACTIVITY_REORDER_TO_FRONT , но он продолжает открывать его снова, поэтому у меня есть активность дважды.

Это мой код:

 event_notification = new Notification(R.drawable.icon, mContext.getString(R.string.event_notif_message), System.currentTimeMillis()); Intent notificationIntent = new Intent(mContext, EventListActivity.class); notificationIntent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); sendNotification(event_notification, notificationIntent, mContext.getString(R.string.event_notif_title), body, Utils.PA_NOTIFICATIONS_ID); 

Могу ли я управлять им с помощью флагов, или я должен хранить переменную в SharedPreferences, чтобы проверить, открыта она или нет?

Благодаря!

Вам нужно установить атрибут launchMode для Activity вы начинаете singleTop . Это приведет к тому, что входящие Intents будут доставлены в существующий экземпляр вместо запуска нового экземпляра, если эта Activity уже находится в верхней части стека задачи.

Это делается в манифесте, добавляя android:launchMode="singleTop" к элементу <activity> . Чтобы получить доступ к последнему намерению (если вас интересуют любые данные, которые могли пройти с ним), переопределите onNewIntent() в своей Activity .

Попробуйте установить флаги в Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP .

Из документации для FLAG_ACTIVITY_CLEAR_TOP (акцент мой):

Если установлено, и запущенная деятельность уже запущена в текущей задаче, то вместо запуска нового экземпляра этого действия все остальные действия поверх нее будут закрыты, и этот намерение будет доставлен в (теперь Наверх) старая деятельность как новое намерение.

Например, рассмотрите задачу, состоящую из действий: A, B, C, D. Если D вызывает startActivity () с намерением, который разрешает компонент активности B, то C и D будут завершены, а B получит заданное намерение , В результате чего стек теперь составляет: A, B.

Текущий исполняемый экземпляр действия B в приведенном выше примере либо получит новое намерение, которое вы начинаете здесь, в его методе onNewIntent (), либо сам закончите и перезапустите с новым намерением. Если он объявил свой режим запуска «множественным» (по умолчанию), и вы не установили FLAG_ACTIVITY_SINGLE_TOP в том же намерении, то он будет завершен и заново создан; Для всех других режимов запуска или если установлен FLAG_ACTIVITY_SINGLE_TOP, этот Intent будет доставляться в onNewIntent () текущего экземпляра.

Используйте onNewIntent() для обработки новых данных из уведомления нажмите и обновите действие.

В onNewIntent получают новые данные из нового намерения (которые обслуживаются новым уведомлением) и ловят их, например:

title = intent.getStringExtra("title")

В onCreate ранее 🙂

Он обновит текущую активность с помощью новых данных уведомления.

Вы также можете следовать этому руководству: http://androidrace.com/2016/12/10/how-to-refresh-activity-on-new-notification-click-android-developer/

 Notification.Builder mBuilder = new Notification.Builder(this) .setSmallIcon(R.drawable.cmplayer) .setContentTitle("CoderoMusicPlayer") .setContentText("PLayer0!"); Intent resultIntent = new Intent(this, AndroidBuildingMusicPlayerActivity.class); resultIntent.setAction(Intent.ACTION_MAIN); resultIntent.addCategory(Intent.CATEGORY_LAUNCHER); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, resultIntent, 0); mBuilder.setContentIntent(pendingIntent); NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); mNotificationManager.notify(1, mBuilder.build()); 

Просто скопируйте код и вставьте его в свою основную деятельность.

Вот оригинальный ответ