我的服务:

public class MusicService extends MediaBrowserServiceCompat {
...
}


我的活动:

public class MediaActivity extends AppCompatActivity{
private MediaBrowserCompat mMediaBrowser;
 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mMediaBrowser = new MediaBrowserCompat(this,
                new ComponentName(this, MusicService.class), mConnectionCallback, null);
        mMediaBrowser.connect();
}

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mMediaBrowser.disconnect();
    }


我想在UI中添加关闭按钮,但是如何停止MusicService?它继续在后台投射。

最佳答案

我在MediaSessionConnection中声明了一个方法:

class MediaSessionConnection( val context: Context, private val serviceComponent: ComponentName ) { ... fun release() { mediaBrowser.disconnect() mediaController.sendCommand("disconnect", null, null) } ... }


MusicService中:

class MusicService : MediaBrowserServiceCompat() { override fun onCreate() { super.onCreate() ... mediaSessionConnector = MediaSessionConnector(mediaSession, object : DefaultPlaybackController() { override fun onCommand(player: Player?, command: String?, extras: Bundle?, cb: ResultReceiver?) { if (command == "disconnect") { stopForeground(true) stopSelf() } } override fun getCommands(): Array { return arrayOf("disconnect") } }) } }


我并不是说这是完全停止服务的正确方法,但这是我在奋斗了几个小时后才想到的解决方案。

如果未执行mediaBrowser.disconnect(),则stopSelf()不会破坏该服务(通过告诉“销毁该服务”,我预计将调用onDestroy())。

如果不显式执行stopForeground()stopSelf(),仅执行mediaBrowser.disconnect()不会破坏服务。

10-07 19:19