У меня есть 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.