«Наш сервис переносит состояние, поэтому я изо всех сил стараюсь сохранить его живым» - сохраняйте соответствующие биты состояния (например, трек, положение в треке), когда вы приостанавливаете воспроизведение, чтобы вы могли восстановить это состояние, если ваш процесс завершается. "Какова рекомендуемая практика поддержания медиа-сессий?" - извини, это за пределами моей области знаний.
отаю над мультимедийным приложением. Интересно, как я могу сохранить какое-то старое поведение моего приложения до Oreo, например, чтобы уведомление и служба (для воспроизведения) зависали там, даже если служба больше не установлена на передний план.
Мы вызываем startService (MediaPlaybackService.class), чтобы запустить службу при запуске воспроизведения, затем создаем уведомление и вызываем startForeground () с ним в службе. Пока все хорошо - если пользователь выходит из приложения, он все равно будет воспроизводить мультимедиа в фоновом режиме и сможет управлять воспроизведением из уведомления.
Когда пользователь приостанавливает воспроизведение, мы вызываем stopForeground (false), чтобы отключить уведомление. Здесь возникает проблема, так как Android Oreo, система предотвращает запуск служб не переднего плана и останавливает работающие. В моем случае при приостановке воспроизведения сервис становится не приоритетным и может быть остановлен системой. И поскольку это похоже на правильный вызов stopSelf (), установка onStartCommand () для возврата «START_STICKY», похоже, не помогает доставить еще один стартовый вызов в службу и, скорее всего, не будет работать, даже если это происходит, потому что приложение все еще работает. в фоновом режиме.
Похоже, что он работает для Spotify - их уведомление остается на неопределенное время, когда воспроизведение приостановлено; и уведомление не допускается, поэтому я решил, что оно не установлено на передний план. Интересно, как это работает для Spotify?
Вот пример кода:
class MyService extends MediaBrowserServiceCompat implements PlayerStateListener {
public int onStartCommand(...) {
//....
return START_STICKY;
}
void onPlaybackStarts() {
makeServiceStart(); // handles before and after 26
Notification notif = buildNotif();
startForeground(NOTIF_ID, notif); // non-zero value
}
void onPlaybackStops() {
// if app is in background at this point, system will stop the service short after the line below.
stopForeground(false);
if (state == Player.IDLE) {
stopSelf();
}
}
}