Уведомление Android Wear не отображается, если используется флаг FLAG_NO_CLEAR.

Если используется флаг «FLAG_NO_CLEAR», уведомление не отображается на Android Wear.

Кто-нибудь знает, почему или какой-либо обходной путь? В документации не нашел никакой информации.

Мне нужен флаг «FLAG_NO_CLEAR» в моих уведомлениях и кнопка «Действие» для «отклонить», «отложить» и т. д.!


person chrisonline    schedule 08.07.2014    source источник
comment
Не могли бы вы вставить свой код? Я предполагаю, что вы всегда используете один и тот же идентификатор уведомления при вызове NotificationManagerCompat.notify().   -  person Poly    schedule 08.07.2014
comment
Я проверил это. Если я удалю FLAG_NO_CLEAR, он будет работать. Так что нет проблем с идентификатором уведомления. И это работает на телефоне с годами. Так что, похоже, это действительно не поддерживается на Android Wear...   -  person chrisonline    schedule 08.07.2014


Ответы (2)


Флаг уведомления FLAG_NO_CLEAR в основном делает ваше уведомление «текущим». Текущие уведомления, отправленные с телефона, НЕ будут отображаться на носимом устройстве.

У вас есть два решения проблемы. У обоих есть свои преимущества и недостатки. Пожалуйста, прочитайте текст ниже и решите, какое решение лучше решит вашу ситуацию :)

Решение 1 - используйте группу:

Вы можете использовать group функцию платформы Android Wear. В основном он создан для публикации множества (сгруппированных) уведомлений на носимых устройствах и одного summary уведомления на телефоне. Но с помощью этого механизма вы также можете опубликовать одно уведомление ongoing на своем телефоне, а второе уведомление только при износе. В итоге вы получите одно ongoing уведомление на свой телефон и одно обычное уведомление на носимое устройство.

    final NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);

    // This notification will be shown only on phone
    final NotificationCompat.Builder phoneNotificationBuilder = new NotificationCompat.Builder(this)
        .setSmallIcon(R.drawable.ic_launcher)
        .setContentTitle("Title phone")
        .setContentText("Text phone")
        .setOngoing(true)
        .setOnlyAlertOnce(true)
        .setGroup("GROUP")
        .setGroupSummary(true);

    // This notification will be shown only on watch
    final NotificationCompat.Builder wearableNotificationBuilder = new NotificationCompat.Builder(this)
        .setSmallIcon(R.drawable.ic_launcher)
        .setContentTitle("Title wearable")
        .setContentText("Text wearable")
        .setOngoing(false)
        .setOnlyAlertOnce(true)
        .setGroup("GROUP")
        .setGroupSummary(false);

    notificationManager.notify(0, phoneNotificationBuilder.build());
    notificationManager.notify(1, wearableNotificationBuilder.build());

Этот метод позволит вам опубликовать «альтернативное» уведомление только для часов, сохранив ваше ongoing уведомление на телефоне. Но (как упоминалось ранее) уведомление на часах не может быть ongoing — это должно быть обычное уведомление. Если вы действительно хотите, чтобы на часах отображалось настоящее уведомление ongoing, вам нужно выбрать второе решение.

Подробнее о группировании уведомлений читайте здесь:
https://developer.android.com/training/wearables/notifications/stacks.html

Решение 2 — создайте носимое приложение:

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

Подробнее о DataApi читайте здесь:
https://developer.android.com/training/wearables/data-layer/index.html
https://developer.android.com/training/wearables/data-layer/data-items.html

Вы также можете взглянуть на мой пост, где я разместил код, демонстрирующий, как использовать DataApi на практике:
https://stackoverflow.com/a/24896043/3827276

person Maciej Ciemięga    schedule 23.07.2014
comment
Еще раз спасибо за вашу замечательную информацию. Теперь я попробовал это, и это работает, если я использую .setOngoing(true) для моего уведомления по телефону, но если я использую FLAG уведомления -> FLAG_NO_CLEAR, это не работает. На часах нет уведомлений. Так что я должен добавить носимое приложение, я думаю. - person chrisonline; 17.11.2014

Честно говоря, что-то действительно странное изменилось в износе 1.5, поэтому решением было бы установить будильник.

Uri alarmSound = getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);


    Intent displayIntent = new Intent(this, WearNotif.class);
    //displayIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    PendingIntent displayPendingIntent = PendingIntent.getActivity(this,
            0, displayIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    Notification notification = new Notification.Builder(this)
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle("WeirdShit")
            .setContentText("some random crap")
            .extend(new Notification.WearableExtender()
                    .setDisplayIntent(displayPendingIntent))
            .setSound(alarmSound)
            .build();

    NotificationManagerCompat notificationManager =
            NotificationManagerCompat.from(this);
    notificationManager.notify(25454, notification);
person Space Monkey    schedule 15.05.2017
comment
Для вызова требуется уровень API 20 мин. - person Carlos Jesus Arancibia Taborga; 30.03.2019