Фоновая музыка в играх и приложениях, каковы лучшие практики. Библиотеки

204
25 июля 2018, 22:20

Основной мой вопрос в том, что я хочу понять архитектуру подобного приложения. Какие классы и с каким отношением встроить.

В игрушку собираюсь добавить фоновую музыку и естественно к такому плееру нужно иметь доступ из разных классов, например я в меню - играет один трэк, перешел в игровое поле - трэк другой или же из игрового поля иметь возможность приглушить фоновую музыку, а на первый план вывести звуки из игры , произошло игровое событие - воспроизвел другой звук ( в последнем случае, наверно нужно создавать второй экземпляр класса для воспроизведения и раз такие звуки привязаны к игровому полю, думаю достаточен один SoundPool используя композицию) Для класса MediaPlayer так и напрашивается использовать шаблон синглтон. Еще вопрос: учитывая, что в приложениях часто, и так же в моем случае, воспроизведение музыки должно прекращаться при сворачивании приложения, то нужен ли мне Service? Думаю что нет.
В любом случае MediaPlayer должен находиться в доп. потоке, а значит нужен способ общения с этим потоком, как это всё правильно реализуется? И есть ли какие то связанные с темой воспроизведения музыки библиотеки?

Answer 1

Если нужно воспроизведение звука и в момент когда приложение свернуто, то нужно конечно использовать Service. Если пишем какой нибудь плеер используем класс MediaController, он обрабатывает обратные вызовы от аппаратных кнопок, от подключенной гарнитуры и так далее, в общем полный контроль над воспроизведением музыки. Вот хорошая статья на этот случай.

В случае описываемом в вопросе, когда воспроизведение звука нужно только в открытом приложении и должно контролироваться из разных активностей, применяем шаблон синглтон. (Думаю не стоит искать решение лучше так как для этого шаблон одиночка и существует. Альтернативой было бы передавать из одной активности в другую экземпляр MediaPlayer и писать лишний код) Т.е. создаем класс в котором есть экземпляр MediaPlayer и обращаемся к нему из любой активности. Как реализовать шаблон одиночка в андроид есть тут , вот статья о правильной реализации этого шаблона в Java.

А теперь насчет того в каком потоке с этим MediaPlayer работать. Само воспроизведение музыки процесс не ресурсоемкий, поэтому можно смело стартовать в главном потоке. А вот загрузка этого ресурса может занимать время. Если ресурс находится в самом приложении или это какой нибудь файл с флешки, то смело работаем в главном потоке, если это загрузка по сети или поток, то для нас у MediaPlayer есть метод prepareAsync(), который произведет подготовку ресурса в отдельном потоке, а по завершению вернет CallBack. В прочем вот разбор MediaPlayer

Насчет библиотек: я ничего не искал, т.к. MediaPlayer это уже так сказать библиотека, в нем реализовано всё самое основное.

READ ALSO
Анимация переворота карты

Анимация переворота карты

Делаю простенькую карточную игруРазложено несколько карт и я хочу, чтобы при нажатии на любую из них она переворачивалась с использованием...

164
Как хранить и редактировать данные?

Как хранить и редактировать данные?

Есть два устройства ардуино, на ней работает акваконтроллер, и андроид-устройство(телефон) на котором я хочу редактировать настройки контроллераВидится...

169
Scanner, FileOutputStream и чтение double

Scanner, FileOutputStream и чтение double

Недавно изучаю JavaНабросал код который копирует double значения из одного файла в другой

169
Hibernate ошибка преобразования MySQL JSON UTF8

Hibernate ошибка преобразования MySQL JSON UTF8

Для расширения типов Hibernate использую vladmihalcea/hibernate-types

191