У меня есть Context.startForegroundService() did not then call Service.startForeground()
в моем сервисе Android, но я не могу понять, почему это происходит.
Мое приложение предназначено для потоковой передачи мультимедиа, и эта ошибка возникает только при паузе с переднего планауведомление (превратив его в обычное уведомление), и вы затем проведете пальцем по уведомлению, которое предназначено для остановки моего сервиса.
Вот единственный метод, где startForegroundService
, startForeground
и stopForeground
методы называются:
private void configureServiceState(long action) {
if (action == PlaybackStateCompat.ACTION_PLAY) {
if (!mServiceInStartedState) {
ContextCompat.startForegroundService(
StreamingService.this,
new Intent(
StreamingService.this,
StreamingService.class));
mServiceInStartedState = true;
} startForeground(NOTIFICATION_ID,
buildNotification(PlaybackStateCompat.ACTION_PAUSE));
} else if (action == PlaybackStateCompat.ACTION_PAUSE) {
stopForeground(false);
NotificationManager mNotificationManager
= (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
assert mNotificationManager != null;
mNotificationManager
.notify(NOTIFICATION_ID,
buildNotification(PlaybackStateCompat.ACTION_PLAY));
} else if (action == PlaybackStateCompat.ACTION_STOP) {
mServiceInStartedState = false;
stopForeground(true);
stopSelf();
}
}
И вот где задано намерение удаления моего уведомления:
.setDeleteIntent(
MediaButtonReceiver.buildMediaButtonPendingIntent(
this, PlaybackStateCompat.ACTION_STOP));
Этот configureServiceState(long action)
метод вызывается только из моих MediaSession
обратных вызовов:onPlay
, onPause
и onStop
... очевидно, что действие является предполагаемым действием, которое должно быть выполнено.
Ошибка не возникает при выполнении onStop
из моего пользовательского интерфейса или при вызовеonPause
, за которым следует onStop
из пользовательского интерфейса (зеркальное отражение действия, необходимого для очистки уведомления), только из уведомления.
Все, что я могу найти об этой ошибке, это то, что она предположительно возникает при вызове startForegroundService
но не звоните startForeground
в течение 5 секунд ... однако startForeground
вызывается сразу после того, как только startForegroundService
вызывается.
Кроме того, onPlaybackStateChange
идет к моему 'СейчасИгровое действие в методе onStop
, который запускает это действие для запуска finish()
, так что служба не перезапускается таким образом.
Что мне здесь не хватает?
Дополнительные сведения:
Служба не перезапускается частично из-за моей активности «сейчас играет», поскольку выполнение кода никогда не достигает ни одного из его методов.
выполнение кода также никогда не вводится повторно configureServiceState
до появления ошибки
Если я добавлю точку останова в последнюю возможную точку (MediaButtonReceiver.handleIntent(mMediaSession, intent);
в onStartCommand
моего сервиса), приостановка выполнения здесь и попытка отладки приводят к отключению отладчика вскоре после приостановки
Попытка использовать другой канал уведомления для переднего плана по сравнению с обычным уведомлением также не имеет значения
Проведение приостановленного уведомления от экрана блокировки не вызывает ошибку, оно происходит только в том случае, если телефон разблокирован;независимо от того, действительно ли мое приложение открыто
Полное исключение:
android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground()
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1870)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6809)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Мое тестовое устройство работает под управлением Android 8.0, минимальный API проекта - 21, а целевой API -27. API устройства - 26.