Начало деятельности с помощью уведомления: избегание повторяющихся действий

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

Intent notificationIntent = new Intent(context, LaunchActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
mNotificationManager.notify(1, notification);

Однако я обнаружил случай, когда появляется ошибка. Если пользователь запускает приложение, щелкнув значок "Обычный", и во время запуска активности клики по уведомлению, новая активность запускается без предыдущего выхода, а позже - поверх предыдущего. И это еще не все: дополнительные клики по уведомлению создадут дополнительные действия и помещают их поверх уже запущенных. Как я могу это предотвратить? Есть ли хорошая проверка, чтобы посмотреть, показывается или загружается какая-либо определенная активность?

Ответ 1

То, как оно должно быть по умолчанию. Вероятно, вам нужно указать android:launchMode="singleTop", если вы хотите иметь только один экземпляр.
Существует 4 режима запуска, более подробная информация здесь: https://developer.android.com/guide/topics/manifest/activity-element.html

Ответ 2

При использовании lanchMode="singleTask", если экземпляр вашей активности уже существует, Android не воссоздает активность, а запускает ее с помощью метода onNewIntent().

Как описано в Android:

Система создает активность в корне новой задачи и перенаправляет ее на нее. Однако, если экземпляр действия уже существует, система перенаправляет намерение на существующий экземпляр посредством вызова его метода onNewIntent(), а не создает новый.

Документация для Android для режима активности

Ответ 3

Как уже упоминалось выше, вы должны установить режим запуска приложения, который определен в определении активности в манифесте:

<activity
    android:name="com.company.ActivityName"
    android:launchMode="singleTask">
</activity>

Кроме того, вы можете заметить, что, несмотря на то, что FLAG_ACTIVITY_SINGLE_TOP является допустимым флагом Intent, флаги эквивалентного намерения для singleTask или singleInstance отсутствуют.

Подробнее о различных вариантах режима запуска см. в разделе launchMode: http://developer.android.com/guide/topics/manifest/activity-element.html#lmode