активность и / или сервис

#android

#Android

Вопрос:

В моем приложении есть activity и сервисный компонент.

Цель состоит в том, чтобы позволить сервису позаботиться о подготовке SurfaceView и экземпляра mediaplayer, для которого требуется держатель surface. Мой носитель — это видеофайл.

Возможно ли создать представление surface из моего сервиса?

Могу ли я вызвать следующее

surface = (MySurfaceView) findViewById(R.id.surface);

в моем сервисном компоненте?

Если бы я это сделал, я мог бы затем назначить surface.getHolder экземпляру проигрывателя setDisplay() .

Общая цель состоит в том, чтобы выдавать команды (play, stop, seek и т.д.) Из activity и заставить службу реализовать управление состоянием медиаплеера.

Вероятно, я мог бы поместить все это в свою активность, но когда я поворачиваю устройство, я не хочу разрушать surface и воссоздавать его onConfigurationChanged() . Следовательно, рассмотрим использование сервиса для моей ситуации здесь.

Любые идеи или решения высоко ценятся.

Спасибо.

Ответ №1:

Вы могли бы использовать AsyncTask реализацию вместо сервиса и сделать

  • вся фоновая работа выполняется в его doInBackground методе (другой поток, не будет беспокоить пользовательский интерфейс), в то время как
  • вся работа, связанная с пользовательским интерфейсом, может быть выполнена в onPostExecute методе (потоке пользовательского интерфейса).

Обновить
Поскольку вам нужно, чтобы ваши мультимедиа воспроизводились в фоновом потоке (без возможных прерываний процессами gui), Service может быть выбором для вас. Вам также понадобится Activity хотя для запуска, остановки и управления вашим сервисом.
О том, как реализовать этот дизайн, вы можете ознакомиться с этим руководством MusicDroid, часть 2.

Хотя использовать сервисы для этой задачи необязательно, решение @CommonsWare очень элегантное и удобное.
Тестовое приложение для потокового видео от @CommonsWare и этот образец аудио / видеоплеера не используют сервисы.

Комментарии:

1. Я не понимаю, как AsyncTask мог бы мне помочь. Медиаплеер должен работать в фоновом режиме в течение всего срока службы приложения.

2. MediaPlayer будет воспроизводить только аудио, если surface недоступен. Я не уверен, что вы можете подключить / отсоединить / повторно подключить surface на лету, но воспроизведение должно работать нормально без surface. Это означает, что вы можете поместить свой плеер в сервис, в то время как surface будет управляться activity.

3. Я добавил несколько полезных ссылок на сообщения — с примерами, — которые знакомят вас с различными реализациями этой задачи.

4. Привет, иназарук, именно в этом моя проблема — проигрывателю в сервисе нужна поверхность, НО поверхность управляется активностью. Как соединить их? Могу ли я передать объект surface view сервисному компоненту (через putExtra от Intent) при вызове startService()? Если да, можете ли вы указать мне, как отправить объект в intent? Я использовал его только для отправки строк и целых чисел и некоторых других примитивных типов.

5. Привет, рекасзеру, я смотрю на ваши ссылки. Позвольте мне посмотреть, соответствует ли что-нибудь моим потребностям. Спасибо, что нашли время разместить ссылки здесь.

Ответ №2:

Если вы хотите запускать и останавливать Service из Activity , попробуйте использовать подход, описанный в этом примере приложения. У меня это сработало.

Демо-версию можно даже загрузить. Вам понадобится этот музыкальный файл.