3

我的服务:

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?它继续在后台投射。

4

2 回答 2

3

我已经声明了一个方法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()不会破坏服务。

于 2018-12-14T08:23:29.263 回答
1

从任何地方停止: getActivity().stopService(new Intent(getActivity().getApplicationContext(), YourServiceName.class));

于 2018-02-01T12:24:23.983 回答