Текущее уведомление и singleTop-Flag

Большинство из вас, кто знаком с API уведомлений и PendingIntent, знают, что setLatestEventInfo сейчас устарел.

Поэтому я пытаюсь заменить свой существующий код (в зависимости от устаревшего метода):

    Context context = getApplicationContext();
    Intent activityIntent = new Intent(context, Activity.class);
    activityIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    Notification notification = new Notification(R.drawable.icon, getString(R.string.notify),System.currentTimeMillis());
    PendingIntent startIntent = PendingIntent.getActivity(context, 0, activityIntent, 0);
    notification.setLatestEventInfo(context, getString(R.string.notify), getString(R.string.notifysummary), startIntent);
    this.startForeground(1234,notification);

Как вы можете догадаться, я вызываю это из службы, работающей в фоновом режиме. Когда служба запустится, она вызовет уведомление. Это постоянное постоянное уведомление, которое выводит действие «Activity.class» на передний план, если оно существует, и создает новый экземпляр действия, если оно было уничтожено. Работает нормально без проблем.

Теперь, желая перейти на более новый уровень API, я пытаюсь заменить приведенный выше код следующим NotificationBuilder:

        Context context = getApplicationContext();
        Intent activityIntent = new Intent(context, Activity.class);            
        activityIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        PendingIntent startIntent = PendingIntent.getActivity(context, 0, activityIntent,  Intent.FLAG_ACTIVITY_SINGLE_TOP);
        Notification notification = new Notification.Builder(context).setSmallIcon(R.drawable.ic_launcher).setContentText("App running").setContentTitle("My app").setOngoing(true).setAutoCancel(false).setContentIntent(startIntent).build();
        this.startForeground(1234,notification);

Но нажатие на уведомление не имеет никакого эффекта. Однако я уже пробовал «Intent.FLAG_ACTIVITY_NEW_TASK», потому что в документации сказано, что я должен это делать. Это создает новую задачу, даже если действие уже находится сверху, в отличие от того, что говорится в документе: PendingIntent, FLAG_ACTIVITY_NEW_TASK.

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

Спасибо за вашу помощь.


person mad    schedule 24.07.2013    source источник


Ответы (1)


Это неправильно:

PendingIntent startIntent = PendingIntent.getActivity(context, 0, activityIntent,  Intent.FLAG_ACTIVITY_SINGLE_TOP);

Вы передаете флаг Intent в getActivity(). Четвертый параметр для getActivity() принимает PendingIntent флагов, например:

  • PendingIntent.FLAG_CANCEL_CURRENT
  • Ожидание намерения.FLAG_NO_CREATE
  • Ожидание намерения.FLAG_ONE_SHOT
  • Ожидание намерения.FLAG_UPDATE_CURRENT

Вы передаете Intent.FLAG_ACTIVITY_SINGLE_TOP в качестве 4-го параметра. Эта константа на самом деле имеет значение 0x20000000. По совпадению, PendingIntent.NO_CREATE также имеет значение 0x20000000, так что вы делаете то же самое:

PendingIntent startIntent = PendingIntent.getActivity(context, 0, activityIntent,  PendingIntent.NO_CREATE);

Это твоя проблема.

Просто установите 4-й параметр от getActivity() до 0, как в исходном коде.

person David Wasser    schedule 25.07.2013
comment
Вы абсолютно правы. Это было (за некоторыми другими недостатками) причиной. Исправлено сейчас. Большое спасибо. - person mad; 30.07.2013