Основной мой вопрос в том, что я хочу понять архитектуру подобного приложения. Какие классы и с каким отношением встроить.
В игрушку собираюсь добавить фоновую музыку и естественно к такому плееру нужно иметь доступ из разных классов, например я в меню - играет один трэк, перешел в игровое поле - трэк другой или же из игрового поля иметь возможность приглушить фоновую музыку, а на первый план вывести звуки из игры
, произошло игровое событие - воспроизвел другой звук ( в последнем случае, наверно нужно создавать второй экземпляр класса для воспроизведения и раз такие звуки привязаны к игровому полю, думаю достаточен один SoundPool
используя композицию) Для класса MediaPlayer
так и напрашивается использовать шаблон синглтон. Еще вопрос: учитывая, что в приложениях часто, и так же в моем случае, воспроизведение музыки должно прекращаться при сворачивании приложения, то нужен ли мне Service
? Думаю что нет.
В любом случае MediaPlayer
должен находиться в доп. потоке, а значит нужен способ общения с этим потоком, как это всё правильно реализуется? И есть ли какие то связанные с темой воспроизведения музыки библиотеки?
Если нужно воспроизведение звука и в момент когда приложение свернуто, то нужно конечно использовать Service
. Если пишем какой нибудь плеер используем класс MediaController
, он обрабатывает обратные вызовы от аппаратных кнопок, от подключенной гарнитуры и так далее, в общем полный контроль над воспроизведением музыки. Вот хорошая статья на этот случай.
В случае описываемом в вопросе, когда воспроизведение звука нужно только в открытом приложении и должно контролироваться из разных активностей, применяем шаблон синглтон. (Думаю не стоит искать решение лучше так как для этого шаблон одиночка и существует. Альтернативой было бы передавать из одной активности в другую экземпляр MediaPlayer
и писать лишний код) Т.е. создаем класс в котором есть экземпляр MediaPlayer
и обращаемся к нему из любой активности. Как реализовать шаблон одиночка в андроид есть тут , вот статья о правильной реализации этого шаблона в Java.
А теперь насчет того в каком потоке с этим MediaPlayer работать. Само воспроизведение музыки процесс не ресурсоемкий, поэтому можно смело стартовать в главном потоке. А вот загрузка этого ресурса может занимать время. Если ресурс находится в самом приложении или это какой нибудь файл с флешки, то смело работаем в главном потоке, если это загрузка по сети или поток, то для нас у
MediaPlayer
есть метод prepareAsync()
, который произведет подготовку ресурса в отдельном потоке, а по завершению вернет CallBack
. В прочем вот разбор MediaPlayer
Насчет библиотек: я ничего не искал, т.к. MediaPlayer это уже так сказать библиотека, в нем реализовано всё самое основное.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Делаю простенькую карточную игруРазложено несколько карт и я хочу, чтобы при нажатии на любую из них она переворачивалась с использованием...
Есть два устройства ардуино, на ней работает акваконтроллер, и андроид-устройство(телефон) на котором я хочу редактировать настройки контроллераВидится...
Недавно изучаю JavaНабросал код который копирует double значения из одного файла в другой
Для расширения типов Hibernate использую vladmihalcea/hibernate-types