如何停止MediaBrowserServiceCompat?

时间:2017-04-14 10:58:03

标签: android android-mediaplayer mediabrowserservice mediabrowserservicecompat mediabrowser

我的服务:

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

2 个答案:

答案 0 :(得分:1)

我在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()并不会破坏服务。

答案 1 :(得分:0)

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