Нажмите на уведомление начинает деятельность дважды - PullRequest
11 голосов
/ 04 апреля 2011

Я создаю уведомление от службы со следующим кодом:

NotificationManager notificationManager = (NotificationManager) ctx
.getSystemService(Context.NOTIFICATION_SERVICE);

CharSequence tickerText = "bla ...";
long when = System.currentTimeMillis();
Notification notification = new Notification(R.drawable.icon,
tickerText, when);

Intent notificationIntent = new Intent(ctx, SearchActivity.class).
putExtra(SearchActivity.INTENT_SOURCE,
MyNotificationService.class.getSimpleName());

PendingIntent contentIntent = PendingIntent.getActivity(ctx, 0,
notificationIntent, 0);
notification.setLatestEventInfo(ctx, ctx.getString(R.string.app_name),
tickerText, contentIntent);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notificationManager.notify(1, notification);

В журналах четко сказано, что метод startActivity вызывается дважды:

04-02 23:48:06.923: INFO/ActivityManager(2466): Starting activity: Intent { act=android.intent.action.SEARCH cmp=com.xy/.SearchActivity bnds=[0,520][480,616] (has extras) }
04-02 23:48:06.923: WARN/ActivityManager(2466): startActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: Intent { act=android.intent.action.SEARCH cmp=com.xy/.SearchActivity bnds=[0,520][480,616] (has extras) }
04-02 23:48:06.958: INFO/ActivityManager(2466): Starting activity: Intent { act=android.intent.action.SEARCH cmp=com.xy/.SearchActivity bnds=[0,0][480,96] (has extras) }
04-02 23:48:06.958: WARN/ActivityManager(2466): startActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: Intent { act=android.intent.action.SEARCH cmp=com.xy/.SearchActivity bnds=[0,0][480,96] (has extras) }
04-02 23:48:07.087: INFO/notification(5028): onStartCmd: received start id 2: Intent { cmp=com.xy/.NotificationService }
04-02 23:48:07.310: INFO/notification(5028): onStartCmd: received start id 3: Intent { cmp=com.xy/.NotificationService }
04-02 23:48:07.392: INFO/ActivityManager(2466): Displayed activity com.xy/.SearchActivity: 462 ms (total 462 ms)
04-02 23:48:07.392: INFO/ActivityManager(2466): Displayed activity com.xy/.SearchActivity: 318 ms (total 318 ms)

Почему они начали дважды?

Существует два идентичных вопроса о стеке потока: здесь и здесь . Но они не объясняют, какой может быть первоначальная проблема, и они не работают для меня. Например. переход на launchMode singleTop мне не подходит, и он должен работать без изменения launchMode в соответствии с официальным документом (см. Вызов диалога поиска).

Тем не менее, я также попытался добавить следующие флаги к уведомлению Intent

Intent.FLAG_ACTIVITY_CLEAR_TOP | PendingIntent.FLAG_UPDATE_CURRENT

но проблема остается той же.

Ответы [ 4 ]

14 голосов
/ 08 апреля 2011

То же самое, проблема возникает на Samsung Galaxy S. Есть хорошая идея для обхода проблемы?

Сейчас я проверяю, было ли подобное намерение уже получено, и завершаю операцию, если это так. Это работает, но выглядит не очень хорошо.

Можем ли мы как-то отменить второе намерение?

ОБНОВЛЕНИЕ: я мог бы предотвратить проблему, установив FLAG_ONE_SHOT следующим образом:

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_ONE_SHOT);
5 голосов
/ 30 июля 2012

Пожалуйста, используйте флаг, как показано ниже.

notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
                            |Intent.FLAG_ACTIVITY_SINGLE_TOP);
1 голос
/ 06 июня 2012

Позвоните на отпущенную или нажатую клавишу (избегайте общих ДЕЙСТВИЙ)!

if(event.getAction() == event.ACTION_UP){
   Intent intent = new Intent(......);
   startActivityForResult(intent, 0);
}
0 голосов
/ 06 апреля 2011

Это похоже на ошибку галактики Самсунг. Подтвердил, что на другом устройстве все в порядке.

(См. Также нет обсуждения в группах Google )

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

// put a hint into the notification and check if the intent
// comes from notification or not:
String intentSource = queryIntent.getStringExtra(INTENT_SOURCE);
if (NotificationService.class.getSimpleName().equals(intentSource)) {
// don't do this again e.g. when rotating!
queryIntent.removeExtra(INTENT_SOURCE);

if (getIntent() != null && getIntent().getSourceBounds() != null) {
    if (getIntent().getSourceBounds().top == 0
            && getIntent().getSourceBounds().left == 0) {
        Log.w("search", "Problematic double trigger!");
    }
}
}

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

...