Base class for media session services, which is the service containing
It's highly recommended for an app to use this if it wants to keep media playback in the background.
Here are the benefits of using
- Another app can know that your app supports
MediaSessioneven when your app isn't running.
- Another app can start playback of your app even when your app isn't running.
To extend this class, adding followings directly to your
<service android:name="component_name_of_your_implementation" > <intent-filter> <action android:name="androidx.media2.session.MediaSessionService" /> </intent-filter> </service>
You may also declare
android.media.browse.MediaBrowserServicefor compatibility with
MediaBrowserCompat. This service can handle it automatically.
It's recommended for an app to have a single
MediaSessionService declared in the
manifest. Otherwise, your app might be shown twice in the list of the Auto/Wearable, or another
app fails to pick the right session service when it wants to start the playback of this app.
If you want to provide multiple sessions here, take a look at
Supporting Multiple Sessions.
Topics covered here:
Session service is a bound service. When a
MediaController is created for the
session service, the controller binds to the session service.
onGetSession(ControllerInfo) would be called inside of the
After the binding, session's
will be called to accept or reject connection request from a controller. If the connection is
rejected, the controller will unbind. If it's accepted, the controller will be available to use
and keep binding.
When playback is started for this session service,
is called for the playback's session and service would become a foreground service. It's needed
to keep playback after the controller is destroyed. The session service becomes background
service when all playbacks are stopped. Apps targeting API
Build.VERSION_CODES.P or later must request the permission
Manifest.permission.FOREGROUND_SERVICE in order to make the service foreground.
The service is destroyed when the all sessions are closed, or no media controller is binding to the session while the service is not running as a foreground service.
Any app can bind to the session service with controller, but the controller can be used only if
the session service accepted the connection request through
Supporting Multiple SessionsGenerally speaking, multiple sessions aren't necessary for most media apps. One exception is if your app can play multiple media content at the same time, but only for the playback of video-only media or remote playback, since audio focus policy recommends not playing multiple audio content at the same time. Also keep in mind that multiple media sessions would make Android Auto and Bluetooth device with display to show your apps multiple times, because they list up media sessions, not media apps.
However, if you're capable of handling multiple playback and want to keep their sessions while
the app is in the background, create multiple sessions and add to this service with
MediaController can be created with
connecting any session in this service. In that case,
be called to know which session to handle incoming connection request. Pick the best session
among added sessions, or create new one and return from the