Воспроизведение музыки BG в разных действиях в Android
Здравствуйте! Впервые задаю вопрос здесь, на stackoverflow. Захватывающе! Ха-ха.
Мы разрабатываем игру для Android и включаем фоновую музыку для нашего вступления (у нас есть вступительное действие), но мы хотим, чтобы оно продолжалось до следующего действия и, возможно, была возможность остановить или воспроизвести музыку снова из любого места приложения.
Что мы делаем в данный момент, так это проигрываем bgm с помощью MediaPlayer во время нашего вступительного действия. Однако мы останавливаем музыку, как только пользователь завершает это действие. Обязательно ли для этого использовать что-то вроде сервисов? Или достаточно MediaPlayer / SoundPool? Если кто-нибудь знает ответ, мы были бы рады, если бы вы поделились им с нами. Спасибо!
Переведено автоматически
Ответ 1
Вы также можете создать сервис, который воспроизводит музыку с помощью mediaplayer, как показано ниже.
player = MediaPlayer.create(this, R.raw.idil); player.setLooping(true); // Set looping player.setVolume(100,100);
} publicintonStartCommand(Intent intent, int flags, int startId) {
player.start();
return1; }
publicvoidonStart(Intent intent, int startId) { // TODO
} public IBinder onUnBind(Intent arg0) { // TODO Auto-generated method stub
returnnull; }
publicvoidonStop() {
} publicvoidonPause() {
} @Override publicvoidonDestroy() {
player.stop(); player.release(); }
@Override publicvoidonLowMemory() {
} }
Ответ 2
Создайте статический SoundManager, используя либо SoundPools, либо MediaPlayers.
Создайте статический флаг под названием keepMusicGoing.
Запустите музыку при создании первого действия.
При переключении активностей установите для keepMusicGoing значение true.
В событии onStop ваших действий проверьте, имеет ли значение keepMusicGoing значение true, если да, оставьте музыку включенной, затем установите keepMusicGoing значение false.
Если пользователь нажмет кнопку home, флаг keepMusicGoing будет иметь значение false, поэтому музыка остановится, когда действие потеряет фокус.
Напишите мне, и я смогу прислать вам пару саундменеджеров, которые я написал, один использует MediaPlayers, а другой SoundPools
Чад
Ответ 3
Если я правильно понимаю вашу ситуацию, то я несколько раз сталкивался с одной и той же проблемой. Я использую другой поток для воспроизведения музыки в своих приложениях. Эта реализация передает статическую ссылку на контекст, который, как я знаю, будет активен в течение всего времени воспроизведения музыки.
Сначала я использовал метод, в котором сохранялся флаг "keepMusicPlaying", предоставленный Chad. Я думаю, что более элегантно просто использовать методы OnStart и onStop для ваших действий.
Создайте собственный класс "SoundManager" и вызовите в нем некоторые классы OnStart и onStop из всех ваших activitys OnStart и onStop (или используйте базовый класс activity). Отслеживайте OnStart и onStop с помощью startCounter (startCounter ++ в onstart и startCounter-- в onstop). Поскольку начало нового действия вызывается перед onStop старого действия, вы всегда знаете, вызвано ли OnStart в первый раз (startCounter == 1) или запущено из другого вашего действия (startCounter == 2). То же самое с onStope (startCounter == 0 означает, что приложение было закрыто, startCounter == 1 означает, что это просто остановка старого действия, но есть новое).
Таким образом, вы инкапсулируете все в свой SoundManager вместо того, чтобы вызывать какой-либо метод / флаг keepMusicPlaying при каждом запуске действия внутри вашего приложения.
publicvoidOnStart() { startCounter++; if (startCounter == 1) { //start music here }
publicvoidOnStop() { startCounter--; if (startCounter == 0) { // stop music here } }