Начало действия с помощью уведомления: предотвращение дублирования действий - PullRequest
27 голосов
/ 24 февраля 2010

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

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);

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

Ответы [ 3 ]

37 голосов
/ 24 февраля 2010

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

11 голосов
/ 11 июля 2012

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

Как задокументировано Android:

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

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

2 голосов
/ 06 января 2014

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

<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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...