Как остановить MediaBrowserServiceCompat?

Мой сервис:

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();
    }

Я хочу добавить кнопку закрытия в пользовательском интерфейсе, но как остановить MusicService?, потому что он продолжает кастинг в фоновом режиме

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() не разрушит службу.

Для остановки из любого места: getActivity(). StopService(новый Intent(getActivity(). GetApplicationContext(), YourServiceName.class));