С Foreground Service Heads Up Уведомление застряло на экране - PullRequest
0 голосов
/ 06 июля 2019

Мои хедз-ап уведомления отправляются из службы переднего плана. Они нормально работают в нескольких старых новых версиях Android (4.4, 7.0, 9.0), за исключением Android 5, где всплывающее уведомление появляется, а затем «застревает» на экране.

Мой проект компилируется для Android версии 27 с minSdkVersion, установленным на 18.

Я создал свои каналы уведомлений с помощью IMPORTANCE_HIGH. Я создаю свои уведомления с помощью PRIORITY_HIGH и успешно создаю хедз-ап уведомления со звуком и вибрацией.

До сих пор я использовал один идентификатор уведомления для запуска уведомления службы переднего плана, а также для обновления того же уведомления новыми данными.

На моей платформе Android 5 отображается хедз-ап уведомления, а затем остается на экране. Я могу провести боком или вверх, чтобы переместить уведомление во всплывающее окно. Если я нажму на «застрявшее» уведомление, то уведомление ContentIntent сработает, и моя активность отобразится, но теперь уведомление Текущая службы переднего плана пропало ( Служба все еще работает ).

Пока что единственный способ отобразить правильное хедз-ап уведомление для платформы Android 5 - это использовать 2 разных идентификатора уведомления, один идентификатор для запуска службы переднего плана и второй идентификатор уведомления для обновления того же уведомления , с новыми данными. ( но это создает 2 уведомления )

Если я просто не запускаю Службу на переднем плане, то с помощью одного идентификатора уведомления отображается одно уведомление в виде заголовка, затем оно исчезает (, как и должно ) через 5 секунд.

    @Override
    public void onCreate() {
        super.onCreate();
        startForeground(NOTIFY_ID_SERVICE, createNotification(getString(R.string.CHANNEL_ID_FOUND),
                                                getString(R.string.notification_title_default),
                                                getString(R.string.msg_Service_is_enabled),
                                                NotificationCompat.CATEGORY_SERVICE,
                                                NotificationCompat.PRIORITY_DEFAULT,
                                                false).build());
    }

    private NotificationCompat.Builder createNotification(String channelId, String title, String text, String category, int priority, boolean isOngoing) {

        Intent resultIntent = new Intent(this, MainActivity.class);
        resultIntent.setAction(Intent.ACTION_MAIN);
        resultIntent.addCategory(Intent.CATEGORY_LAUNCHER);

        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, resultIntent, 0);


        NotificationCompat.Builder builder = null;
        try {
            builder = new NotificationCompat.Builder(this, channelId)
                    .setSmallIcon(GlobalApp.getAppContext().getApplicationInfo().icon)
                    .setContentTitle(title)
                    .setCategory(category)
                    .setContentText(text)
                    .setOngoing(isOngoing)
                    .setContentIntent(pendingIntent)
                    .setPriority(priority);
        }
        catch(Exception e)
        {
            Log.e(GlobalApp.getLogTag(), "createNotification error: " + e.getMessage());
        }

        return builder;
    }

    private void postNotification(boolean isFound, String elapsedTime) {

        NotificationCompat.Builder builder;

        try {

            builder = createNotification(getString(R.string.CHANNEL_ID_FOUND),
                                getString(R.string.notification_title_default),
                                getString(R.string.msg_internet_found) + "   Elapsed: " + elapsedTime,
                                NotificationCompat.CATEGORY_STATUS,
                                NotificationCompat.PRIORITY_HIGH,
                                false);


            if (isFound) {

                if(GlobalApp.isVibrateEnabled()) {
                    builder.setVibrate(new long[]{1000, 1000, 1000, 1000, 1000});
                }

                if(GlobalApp.getRingtoneFound() != null) {
                    builder.setSound(Uri.parse(GlobalApp.getRingtoneFound()));
                } else {
                    builder.setDefaults(NotificationCompat.DEFAULT_SOUND);
                }

            } else {
                builder = createNotification(getString(R.string.CHANNEL_ID_LOST),
                                getString(R.string.notification_title_default),
                                getString(R.string.msg_internet_lost) + "   Elapsed: " + elapsedTime,
                                NotificationCompat.CATEGORY_STATUS,
                                NotificationCompat.PRIORITY_HIGH,
                                false);


                if(GlobalApp.getConnectionStatus() == GlobalApp.CONNECTION_STATUS_WIFI_LOST) {
                    builder.setContentText(getString(R.string.msg_wifi_lost) + "   Elapsed: " + elapsedTime);
                } else {
                    builder.setContentText(getString(R.string.msg_internet_lost) + "   Elapsed: " + elapsedTime);
                }

                if(GlobalApp.getRingtoneLost() != null) {
                    builder.setSound(Uri.parse(GlobalApp.getRingtoneLost()));
                } else {
                    builder.setDefaults(NotificationCompat.DEFAULT_SOUND);
                }
            }

            if(GlobalApp.isVibrateEnabled()) {
                builder.setVibrate(new long[]{1000, 1000, 1000, 1000, 1000});
            }

            NotificationManagerCompat notificationManager = NotificationManagerCompat.from(GlobalApp.getAppContext());

            notificationManager.notify(NOTIFY_ID_SERVICE, builder.build());
        }
        catch(Exception e)
        {
            Log.e(GlobalApp.getLogTag(), "Notification error: " + e.getMessage());
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...