Когда объект activity получает метод обратного вызова жизненного цикла onCreate(), он должен выполнить следующие действия:
- Создайте и инициализируйте медиасеанс.
- Настройте обратный вызов сеанса воспроизведения медиаконтента
- Установите для получателя кнопки мультимедиа сеанса мультимедиа значение null, чтобы событие кнопки мультимедиа не перезапускало проигрыватель, когда он не виден. Это касается только устройств с Android 5.0 (уровень API 21) и более поздними версиями.
- Как создать и инициализировать контроллер медиаконтента
Ниже приведен пример кода на onCreate(), в котором выполняются эти действия.
Kotlin
private lateinit var mediaSession: MediaSessionCompat
public override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Create a MediaSessionCompat
mediaSession = MediaSessionCompat(this, LOG_TAG).apply {
// Enable callbacks from MediaButtons and TransportControls
setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS or
MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS)
// Do not let MediaButtons restart the player when the app is not visible
setMediaButtonReceiver(null)
// Set an initial PlaybackState with ACTION_PLAY, so media buttons can start the player
val stateBuilder = PlaybackStateCompat.Builder()
.setActions(PlaybackStateCompat.ACTION_PLAY or PlaybackStateCompat.ACTION_PLAY_PAUSE)
setPlaybackState(stateBuilder.build())
// MySessionCallback has methods that handle callbacks from a media controller
setCallback(MySessionCallback())
}
// Create a MediaControllerCompat
MediaControllerCompat(this, mediaSession).also { mediaController ->
MediaControllerCompat.setMediaController(this, mediaController)
}
}
Java
MediaSessionCompat mediaSession;
PlaybackStateCompat.Builder stateBuilder;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Create a MediaSessionCompat
mediaSession = new MediaSessionCompat(this, LOG_TAG);
// Enable callbacks from MediaButtons and TransportControls
mediaSession.setFlags(
MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |
MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
// Do not let MediaButtons restart the player when the app is not visible
mediaSession.setMediaButtonReceiver(null);
// Set an initial PlaybackState with ACTION_PLAY, so media buttons can start the player
stateBuilder = new PlaybackStateCompat.Builder()
.setActions(
PlaybackStateCompat.ACTION_PLAY |
PlaybackStateCompat.ACTION_PLAY_PAUSE);
mediaSession.setState(stateBuilder.build());
// MySessionCallback has methods that handle callbacks from a media controller
mediaSession.setCallback(new MySessionCallback());
// Create a MediaControllerCompat
MediaControllerCompat mediaController =
new MediaControllerCompat(this, mediaSession);
MediaControllerCompat.setMediaController(this, mediaController);
}
Когда приложение закрывается, действие последовательно получает обратные вызовы onPause() и onStop(). Если проигрыватель воспроизводит контент, остановите его, прежде чем его активность исчезнет. Выбор обратного вызова зависит от версии Android.
В Android 6.0 (уровень API 23) и более ранних версиях время вызова метода onStop() не гарантируется. Он может быть вызван через 5 секунд после того, как объект activity исчезнет с экрана. Поэтому в версиях Android до 7.0 приложение должно останавливать воспроизведение в методе onPause(). В Android 7.0 и более поздних версиях система вызывает onStop(), как только действие становится невидимым, поэтому проблем не возникает.
Подведем итоги:
- В Android 6.0 и более ранних версиях остановите проигрыватель в обратном вызове
onPause(). - В Android 7.0 и более поздних версиях останавливайте проигрыватель в обратном вызове
onStop().
Когда действие получает обратный вызов onDestroy(), оно должно освободить и очистить проигрыватель.