Android — Как использовать startForegroundService () и startForeground() для API-28?

#android #service #android-service #android-8.0-oreo #foreground-service

#Android #Обслуживание #android-сервис #android-8.0-oreo #передний план-сервис

Вопрос:

В настоящее время я изучаю, как создать службу чата с плавающим пузырьком на переднем плане.
Однако я заметил, что все библиотеки, которые я пытался использовать, не работают с API-28.
Я полагаю, это связано с новыми ограничениями, упомянутыми здесь, в документах Android.

По сути, в нем говорится, что если я вызываю службу, которая показывает вещи на переднем плане:
я должен вызвать startForegroundService() вместо startService() .

Кроме того, в нем говорится, что:
«После того, как система создала сервис, у приложения есть пять секунд, чтобы вызвать startForeground() метод сервиса, чтобы показать уведомление о новой службе, видимое пользователем».

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

Может ли кто-нибудь привести пример того, как я должен это реализовать?
Пожалуйста, и спасибо вам!

Ответ №1:

 @Override
public void onCreate() {
    mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
    NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

    // Android O requires a Notification Channel.
    if (Build.VERSION.SDK_INT >= 26) {
        CharSequence name = getString(R.string.app_name);
        // Create the channel for the notification
        @SuppressLint("WrongConstant")
        NotificationChannel mChannel = new NotificationChannel(CHANNEL_ID, name, NotificationManager.IMPORTANCE_LOW);
        // Set the Notification Channel for the Notification Manager.
        if (notificationManager != null) {
            notificationManager.createNotificationChannel(mChannel);
        }

        startForegroundService(new Intent(ForegroundService.this, ForegroundService.class));
        //We only need to call this for SDK 26 , since startForeground always has to be called after startForegroundService.
        startForeground(NOTIFICATION_ID, getNotification());
    }
    else {
        startService(new Intent(ForegroundService.this, ForegroundService.class));
    }
  

Кроме того, этот проект является хорошей основой для начала реализации ForegroundService:

https://github.com/googlesamples/android-play-location/tree/master/LocationUpdatesForegroundService

Комментарии:

1. Итак, вы хотите сказать, что для API-26 мне также нужно создать канал уведомлений, если я запускаю службу переднего плана — это правильно? Опять же, я пытаюсь выяснить, как создать «плавающий пузырь / представление в чате на переднем плане», аналогичный тому, как Facebook Messenger делает это. Нужен ли для этого канал Notificationn?

2. Да, вам нужен канал уведомлений для отображения уведомления в API 26 . А для службы переднего плана требуется уведомление в API 26 .

3. Не могли бы вы, возможно, дать мне краткое изложение шагов того, как я теперь буду создавать плавающий чат на переднем плане, начиная с API-26 и выше? Опять же, ни одна из библиотек или примеров больше не работает, поэтому мне просто нужно знать, как их настроить или что я должен добавить.. Я был бы чрезвычайно благодарен.

4. Я никогда раньше не делал ничего подобного. Но ссылка на githbub, которую я опубликовал, предоставит вам часть ForegroundService.

5. Да, я взглянул на ссылку, которую вы опубликовали, но она кажется довольно ориентированной на получение местоположения — и хотя в ней реализован сервис переднего плана, я думаю, что в конечном итоге это будет немного отличаться от того, что мне нужно сделать.. Я все еще немного новичок в некоторых вещах, так что чем меньше путаницы, тем лучше, вы понимаете, что я имею в виду, лол.. Мне не нужно, чтобы меня держали за руку, но в то же время мне иногда бывает трудно отличить, что нужно, а что НЕТ, из примера, основанного на том, что я на самом деле пытаюсь сделать. Я начинаю терять надежду на достижение этого :/