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