Ответ 1
В моем опыте использования Сервисов это не очень хорошая идея.
Фоновая музыка без использования сервисов:
http://www.rbgrn.net/content/307-light-racer-20-days-61-64-completion
Здравствуйте! Первый раз задать вопрос здесь в stackoverflow. Захватывающе! Ха-ха.
Мы разрабатываем Android-игру, и мы играем фоновую музыку для нашего вступления (у нас есть Intro Activity), но мы хотим, чтобы она продолжала играть на следующем мероприятии и, возможно, была в состоянии остановить или воспроизвести музыку снова из в любом месте приложения.
То, что мы делаем в данный момент, - это играть в bgm с помощью MediaPlayer в нашей Intro Activity. Однако мы останавливаем музыку, как только пользователь покидает эту активность. Нужно ли для этого использовать что-то вроде Сервисов? Или достаточно MediaPlayer/SoundPool? Если кто-нибудь знает ответ, мы с радостью оценим, как вы делитесь им с нами. Спасибо!
В моем опыте использования Сервисов это не очень хорошая идея.
Фоновая музыка без использования сервисов:
http://www.rbgrn.net/content/307-light-racer-20-days-61-64-completion
Вы также можете создать сервис, который воспроизводит музыку, используя медиаплеер, как показано ниже.
Intent svc=new Intent(this, BackgroundSoundService.class);
startService(svc); //OR stopService(svc);
public class BackgroundSoundService extends Service {
private static final String TAG = null;
MediaPlayer player;
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
player = MediaPlayer.create(this, R.raw.idil);
player.setLooping(true); // Set looping
player.setVolume(100,100);
}
public int onStartCommand(Intent intent, int flags, int startId) {
player.start();
return 1;
}
public void onStart(Intent intent, int startId) {
// TODO
}
public IBinder onUnBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
public void onStop() {
}
public void onPause() {
}
@Override
public void onDestroy() {
player.stop();
player.release();
}
@Override
public void onLowMemory() {
}
}
Создайте статический SoundManager с помощью SoundPools или MediaPlayers.
Создайте статический флаг под названием keepMusicGoing.
Запустите музыку при создании первой активности.
При переключении actvities установите keepMusicGoing на true.
В событии onStop вашей деятельности проверьте, является ли keepMusicGoing истинным, если так оставить музыку, а затем установите keepMusicGoing на false.
Если они нажимают кнопку home, флаг keepMusicGoing будет ложным, поэтому музыка остановится, когда активность потеряет фокус.
Отправьте мне электронное письмо, и я могу отправить вам пару SoundManagers, которые я написал, использует MediaPlayers и другие SoundPools
Чад
Если я правильно понимаю вашу ситуацию, я несколько раз сталкивался с той же проблемой. Я использую другой поток для воспроизведения музыки в своих приложениях. Эта реализация передает статическую ссылку на Контекст, который, как я знаю, будет живым на время воспроизведения музыки.
public class AudioPlayer extends Thread {
private Context c;
private Thread blinker;
private File file;
public AudioPlayer (Context c, File file) {
this.c = c;
this.file = file;
}
public void go () {
blinker = this;
if(!blinker.isAlive()) {
blinker.start();
}
}
public void end () {
Thread waiter = blinker;
blinker = null;
if (waiter != null)
waiter.interrupt ();
}
public void run () {
MediaPlayer ap = MediaPlayer.create(c, Uri.fromFile(file));
int duration = ap.getDuration();
long startTime = System.currentTimeMillis();
ap.start();
try {
Thread thisThread = Thread.currentThread();
while (this.blinker == thisThread && System.currentTimeMillis() - startTime < duration) {
Thread.sleep (500); // interval between checks (in ms)
}
ap.stop ();
ap.release ();
ap = null;
} catch (InterruptedException e) {
Log.d("AUDIO-PLAYER", "INTERRUPTED EXCEPTION");
ap.stop ();
ap.release();
ap = null;
}
}
}
Вы можете попробовать использовать AsyncPlayer, но вы должны сохранить ссылку на класс, чтобы остановить воспроизведение звука.
Вы можете создать Uri для локального ресурса с помощью Uri uri = Uri.parse("android.resource://com.stackoverlof.android/raw/
beep.mp3");
.
Надеюсь, что это поможет.
Сначала я использовал метод, в котором сохранить флаг "keepMusicPlaying", предоставленный Чадом. Я думаю, что более элегантно использовать методы onStart и onStop для вашей деятельности.
Создайте собственный класс "SoundManager" и вызовите в нем классы onStart и onStop из всех ваших действий onStart и onStop (или используйте базовый класс активности). Следите за onStart и onStop с помощью startCounter (startCounter ++ в onstart и startCounter - в onstop). Поскольку начало нового действия вызывается перед onStop старой активности, вы всегда знаете, вызывается ли onStart в первый раз (startCounter == 1) или запускается из другой вашей активности (startCounter == 2). То же самое с onStope (startCounter == 0 означает, что приложение было закрыто, startCounter == 1 означает его просто остановку из старой активности, но есть новый).
Таким образом вы инкапсулируете все в свой SoundManager вместо того, чтобы называть любой метод keepMusicPlaying/flag при каждом запуске деятельности внутри вашего приложения.
public void OnStart()
{
startCounter++;
if (startCounter == 1)
{
//start music here
}
public void OnStop()
{
startCounter--;
if (startCounter == 0)
{
// stop music here
}
}