Только для Android 9 (Pie): Context.startForegroundService () затем не вызывал Service.startForeground () - отлично работает на Oreo

Мы скорректировали текущее уведомление для Oreo, и оно отлично сработало. Теперь только на Pie (не на устройствах Oreo) мы получаем ошибку с заголовком. Что-то изменилось в службах переднего плана в Pie, чего мне не хватает?

Вот код onCreate для службы переднего плана ->

override fun onCreate() {
    super.onCreate()

    val notification: Notification = NotificationCompat.Builder(this, packageName)
            .setSmallIcon(R.drawable.status_notification_icon)
            .setContentTitle(getString(R.string.ongoing_notify_temp_title))
            .setContentText(getString(R.string.ongoing_notify_temp_message))
            .setGroup(AppConstants.NOTIFICATION_GROUP_ONGOING)
            .setColor(ContextCompat.getColor(this, R.color.custom_blue))
            .build()

    startForeground(ONGOING_NOTIFY_ID, notification)

    appSettings = AppSettings(this)

    weatherLookUpHelper = WeatherLookUpHelper()
    MyRoomDatabase.getInstance().invalidationTracker.addObserver(onChange)

    retrieveCurrentLocation()
    createAlarmManager()
}

как видите, мы просто создаем уведомление, а затем вызываем startForeground. Любые идеи о том, почему этот код генерирует названную ошибку?

Боковое примечание: Fabric Crashlytics показывает, что этот сбой происходит только на устройствах Pixel (пиксель, пиксель xl, пиксель 2, пиксель 2 xl), на которых выполняется Pie.

РЕДАКТИРОВАТЬ: у нас есть разрешение переднего плана в нашем манифесте

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

person Psest328    schedule 26.10.2018    source источник
comment
Есть ли у вас это разрешение в манифесте Manifest.permission.FOREGROUND_SERVICE   -  person May Rest in Peace    schedule 29.10.2018
comment
@MayRestinPeace да, мы делаем   -  person Psest328    schedule 30.10.2018
comment
Вы решили эту проблему?   -  person Knowledge Drilling    schedule 13.03.2019
comment
@knowledgeDrilling, к сожалению, нет. С тех пор я сменил работу, и в проекте, над которым я сейчас работаю, этой проблемы нет, поэтому я сомневаюсь, что буду следить за этим. Извиняюсь :(   -  person Psest328    schedule 13.03.2019


Ответы (3)


Как упоминалось здесь Ограничения фоновой службы, у приложения / службы есть пять секунд для вызова startForeground() , Если приложение не вызывает startForeground () в течение установленного времени, система останавливает службу и объявляет приложение как ANR.

Есть несколько возможностей:

  1. Либо ваша служба переднего плана уничтожается / завершается до вызова метода startForeground().
  2. Или, если служба переднего плана уже создана и ее вызывают снова, тогда метод onCreate не будет вызываться, вместо этого будет вызываться onStartCommand. Затем переместите свою логику на onStartCommand, чтобы вызвать метод startForeground().
  3. Ваш идентификатор уведомления в startForeground не должен быть 0, иначе это также приведет к сбою.
person Arshad Mehmood    schedule 29.10.2018
comment
будет ли включение startForeground в onStartCommand риска из-за дублирования вызовов? - person Psest328; 29.10.2018
comment
Нет, onStartCommand будет вызываться после onCreate только один раз при запуске службы. Но если вы запустите службу несколько раз, то, конечно, onStartCommand будет вызываться несколько раз. - person Arshad Mehmood; 30.10.2018

Что-то изменилось в службах переднего плана в Pie, чего мне не хватает?

ДА. Посмотрите здесь примечания по миграции Android 9 / Pie

Изменить

Разрешение службы переднего плана

Резюме

Приложения, желающие использовать службы переднего плана, теперь должны сначала запросить разрешение FOREGROUND_SERVICE. Это нормальное разрешение, поэтому система автоматически предоставляет его запрашивающему приложению. Запуск службы переднего плана без разрешения вызывает исключение SecurityException.

ОБНОВЛЕНИЕ

связанная проблема в Google Issue Tracker Context.startForegroundService () затем не вызывала Service.startForeground

person AskNilesh    schedule 30.10.2018
comment
@ Psest328 можешь поделиться своим журналом с вопросом - person AskNilesh; 31.10.2018
comment
@ Psest328, здесь есть проблема для проверки Issuesetracker.google.com/issues/76112072 - person AskNilesh; 31.10.2018
comment
@ Psest328 может поделиться ценностью вашего ONGOING_NOTIFY_ID - person AskNilesh; 31.10.2018

Я перестал получать сообщение об ошибке после реализации приведенного ниже кода в ONCREATE

Intent intent1 = new Intent(this, YourActivity.class);
          try {
                startService(intent1);
            }catch ( Exception e1){
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    this.startForegroundService(intent1);
                }else {
                    Crashlytics.log("crash for first time, trying another.");
                    this.startService(intent1);
                }
            }

Для меня звучит странно, но работает нормально, без сбоев.

person Atef Farouk    schedule 12.11.2019
comment
Он не выйдет из строя, но просто сервис (не передний план) не будет работать, когда приложение закрывается из API ›Android oreo - person Kostya M; 02.12.2019