Начало деятельности с помощью уведомления: избегание повторяющихся действий
Итак, в настоящее время я показываю уведомление. Когда пользователь нажимает на это уведомление, приложение запускается. Уведомление сохраняется, чтобы указать, что служба работает в фоновом режиме.
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