Значок уведомления на постоянно включенном дисплее не обновляется - PullRequest
0 голосов
/ 22 февраля 2020

Я создаю приложение, которое отслеживает состояние аккумулятора электромобиля c, и мне нужно обновить значок уведомления на постоянно включенном дисплее (AOD) в соответствии с состоянием заряда (у меня есть 100 значки, по одному на каждое процентное значение;)).

Пока что значок отображается на AOD так, как мне нравится. Но значок не обновляется на AOD, когда я этого хочу. Он остается прежним или обновляется редко, даже когда я меняю идентификатор значка в коде.

Чтобы прояснить: значок уведомления на панели уведомлений обновляется при каждом изменении, только обновление на AOD ненадежный. Когда я смотрю на панель уведомлений, она может показывать 71 (правильное значение), а когда я блокирую экран, AOD по-прежнему показывает 68.

Я знаю, что обновляю его даже во время простоя, так как журналы моего приложения данные в файле журнала, и он имеет правильную временную метку, и мое приложение не зависит от дозы (экономия батареи от et c), даже Samsung или Huawei или таких режимов Deep Doze (так же называется управление батареей). Таймер надежен.

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

    private NotificationCompat.Builder m_NotificationBuilder;

    private NotificationCompat.Builder getNotificationBuilder()
        {
        if (m_NotificationBuilder == null)
            {
            m_NotificationBuilder = new NotificationCompat.Builder(
                    this,
                    NOTIFICATION_CHANNEL);
            m_NotificationBuilder.setOnlyAlertOnce(true);
            m_NotificationBuilder.setShowWhen(true);
            m_NotificationBuilder.setOngoing(true);
            if (Build.VERSION.SDK_INT >= 21)
                {
                m_NotificationBuilder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC);
                }
            m_NotificationBuilder.setContentIntent(getNotificationIntent());
            }
        return (m_NotificationBuilder);
        }

и обновление

    private Notification getUpdateNotification()
        {
        try
            {
            NotificationCompat.Builder builder = getNotificationBuilder();
            boolean bError = (m_CurrentResponse == null) ||
                             m_CurrentResponse.isError();
            boolean bUrgent = (m_CurrentResponse != null) &&
                              (m_CurrentResponse.isError() || !m_CurrentResponse.isCharging());

            builder.setContentTitle(...)
            builder.setContentText(...);

            int nIcon = R.drawable.ic_ntfy_standard;

            if (m_CurrentResponse != null)
                {
                nIcon = getDeviceStateIcon(... calculated ...);
                }
            builder.setSmallIcon(nIcon);
            builder.setWhen(System.currentTimeMillis());
            if (Build.VERSION.SDK_INT >= 21)
                {
                builder.setCategory(bUrgent ? Notification.CATEGORY_ERROR : Notification.CATEGORY_PROGRESS);
                }

            if (Build.VERSION.SDK_INT < 26)
                {
                builder.setPriority(bUrgent ? Notification.PRIORITY_HIGH : Notification.PRIORITY_DEFAULT);
                }

            return (builder.build());
            }
        catch (Exception e)
            {
            CLogUtils.LogExceptionNoThrow(this, e);
            }
        return (null);
        }

, используемое

    void updateNotification()
    {
    try
        {
        NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);

        notificationManager.notify(NOTIFICATION_ID_SUPERVISION_SERVICE, getUpdateNotification());
        }
    catch (Exception e)
        {
        CLogUtils.LogExceptionNoThrow(this, e);
        }
    }

Канал уведомлений был создан с

notificationChannel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);

Чего не хватает?

...