Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Oreo:让启动的后台服务保持活动状态而不将其设置为前台(但带有通知)?_Android_Media Player_Background Service_Android 8.0 Oreo_Android 8.1 Oreo - Fatal编程技术网

Android Oreo:让启动的后台服务保持活动状态而不将其设置为前台(但带有通知)?

Android Oreo:让启动的后台服务保持活动状态而不将其设置为前台(但带有通知)?,android,media-player,background-service,android-8.0-oreo,android-8.1-oreo,Android,Media Player,Background Service,Android 8.0 Oreo,Android 8.1 Oreo,我正在开发一个媒体应用程序。我想知道如何保持我的应用程序在Oreo之前的一些旧行为,例如,即使服务不再设置为前台,通知和服务(用于播放)也会挂在那里 我们调用startService(MediaPlaybackService.class)在播放开始时启动服务,然后创建一个通知并在服务上调用startForeground()。到目前为止还不错-如果用户退出应用程序,用户仍可以在后台播放媒体,并可以通过通知控制播放 当用户暂停播放时,我们调用stopForeground(false)以使通知不被允许

我正在开发一个媒体应用程序。我想知道如何保持我的应用程序在Oreo之前的一些旧行为,例如,即使服务不再设置为前台,通知和服务(用于播放)也会挂在那里

我们调用startService(MediaPlaybackService.class)在播放开始时启动服务,然后创建一个通知并在服务上调用startForeground()。到目前为止还不错-如果用户退出应用程序,用户仍可以在后台播放媒体,并可以通过通知控制播放


当用户暂停播放时,我们调用stopForeground(false)以使通知不被允许。问题来了,因为Android Oreo,系统阻止启动非前台服务并停止运行的服务。在我的例子中,在暂停播放时,服务将变为非前台服务,并可能被系统停止。而且,由于这就像一个正确的stopSelf()调用,将onStartCommand()设置为返回“START\u STICKY”似乎无助于向服务提供另一个启动调用,而且很可能无法工作,即使这样,因为应用程序仍在后台

它看起来对Spotify有效——播放暂停时,它们的通知将无限期地保留;通知是可驳回的,所以我认为它没有设置为前台。想知道Spotify是如何工作的

以下是一些示例代码:

class MyService extends MediaBrowserServiceCompat implements PlayerStateListener {

  public int onStartCommand(...) {
    //....
    return START_STICKY;
  }

  void onPlaybackStarts() {
    makeServiceStart(); // handles before and after 26
    Notification notif = buildNotif();
    startForeground(NOTIF_ID, notif);  // non-zero value
  }

  void onPlaybackStops() {
    // if app is in background at this point, system will stop the service short after the line below.
    stopForeground(false);
    if (state == Player.IDLE) {
      stopSelf();
    }
  }
}

您是否在使用通知操作?无论您的服务是否已经启动,都可以使用此功能,假设您的
onPlaybackStarts()
/
onPlaybackStops()
是根据从
onPlay()
/
onStop()
调用的。“在我的情况下,暂停播放时,服务将变为非前台服务,并且会被系统停止。”这有什么问题?您的
通知
可以通过
getForegroundService()
PendingContent
启动服务,前提是用户点击您在该
通知
中的操作(或任何内容)以恢复播放。换句话说,用户与通知交互(按播放按钮)可以再次启动前台服务。@commonware感谢您的回复!现在我意识到,对于具有此功能的应用程序来说,情况可能完全如此。我们的服务带有状态,所以我一直在努力保持它的活力。按照我们设计应用程序的方式,mediaSession不是唯一/主要的真相来源,在service.ondestory()上,我们做了大量清理工作,例如取消通知和发布媒体会话。嗯,让我试着让服务离开,而不是在服务销毁时释放mediaSession。。保持媒体对话的建议做法是什么?谢谢,谢谢!!“我们的服务带有状态,因此我一直在努力使其保持活动状态”——在暂停播放时保留相关的状态位(例如,曲目、曲目中的位置),以便在进程终止时恢复该状态。“保持媒体对话的建议做法是什么?”--对不起,这超出了我的专业范围。