У меня есть Context.startForegroundService() did not then call Service.startForeground()
в моей службе Android, но я не могу понять, почему это происходит.
Мое приложение предназначено для потоковой передачи мультимедиа, и эта ошибка возникает только тогда, когда вы приостанавливаете уведомление переднего плана (превращая его в регулярное уведомление), а затем удаляете уведомление, которое предназначено для остановки моего обслуживания.
Вот единственный метод, startForeground
stopForeground
методы 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
вызовов MediaSession
: onPlay
, onPause
и onStop
... очевидно, что действие является предполагаемым действием, которое необходимо выполнить.
Ошибка при выполнении onStop
из моего пользовательского интерфейса или при вызове onPause
за которым следует onStop
из пользовательского интерфейса (зеркальное отображение действия, необходимого для очистки уведомления), только из уведомления.
Все, что я могу найти об этой ошибке, заключается в том, что она якобы возникает, когда вы вызываете startForegroundService
но не вызываете startForeground
течение 5 секунд... однако startForeground
вызывается сразу же после startForegroundService
только startForegroundService
.
Кроме того, onPlaybackStateChange
переходит к моей активности "Now Playing" в методе onStop
, который запускает эту 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. Device API - 26.