«Наш сервис переносит состояние, поэтому я изо всех сил стараюсь сохранить его живым» - сохраняйте соответствующие биты состояния (например, трек, положение в треке), когда вы приостанавливаете воспроизведение, чтобы вы могли восстановить это состояние, если ваш процесс завершается. "Какова рекомендуемая практика поддержания медиа-сессий?" - извини, это за пределами моей области знаний.

отаю над мультимедийным приложением. Интересно, как я могу сохранить какое-то старое поведение моего приложения до 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();
    }
  }
}

Ответы на вопрос(0)

Ваш ответ на вопрос