#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
, попробуйте использовать подход, описанный в этом примере приложения. У меня это сработало.
Демо-версию можно даже загрузить. Вам понадобится этот музыкальный файл.