안녕하세요 꾸준한 노력만이 입니다...
이번에 질문을 드릴 것은 앱에서의 BGM을 나오게 하는건데요...간단히 말하면 sdcard에 있는 mp3파일을 재생하는 것입니다.
제가 구현한 앱은 10개정도의 액티비티가 있고 각각 게시판들, 설정, 메인, 이미지보기, 동영상보기등 각각의 기능들을 가지고 있습니다.
구조를 말씀드리자면...
<서비스>
public static MediaPlayer player
onCreate()에서 player 객체생성, player.setDataSource("파일경로") , player.prepare(), player.setLooping(true)
onStart()에서 player.start()
onDestroy에서 player.release()
<메인액티비티>
onCreate()에서 무조건 startService를 실행
// bgmOnOff는 SharedPreferences에 저장된 값이며 설정을 통해서 저장됩니다. 초기셋팅은 true입니다.
if (bgmOnOff == false) {
MusicService.player.pause();
}
앱을 첫실행시는 bgmOnOff의 초기셋팅에 따라 위의 코드를 타지 않고 음악이 재생이 됩니다.
만약 설정화면에서 bgmOnOff의 설정을 false로 바꾼다면 서비스를 종료하는 것이 아니라 앱이 실행되는 동안
MusicService.player.pause(); 를 통해 멈추기만 해둡니다. 다시 true로 바꾸면
MusicService.player.start(); 를 통해 멈춘시점부터 즉시 재생이 됩니다.
앱의 종료시점은 반드시 메인 엑티비티를 통해서 종료되게 되어 있습니다.
onDestroy()에서
if (bgmOnOff == false) {
stopService(intent);
} else {
if (MusicService.player.isPlaying()) {
stopService(intent);
}
}
위 코드를 통해서 서비스를 종료하게 됩니다.
서비스로 BGM을 재생하게 됨으로 10개정도의 액티비티를 왔다갔다 하더라도 끊김없이 재생이 되고 설정에서 재생컨트롤이 가능합니다. 하지만 이경우 Home키를 누르게 되면 계속해서 BGM이 나오게 됩니다. (Home키에 대한 제어가 안되기 때문에 해결할 수 있는 적절한 방법을 찾지 못하고 있습니다)
위와 같은 문제를 해결하기 위해서...
각각의 액티비티 마다 onPause()가 호출될때에는
@Override
protected void onPause() {
// TODO Auto-generated method stub
if(MainScreen.bgmOnOff == true){
if (MusicService.player.isPlaying()) {
MusicService.player.pause();
}
}
super.onPause();
}
onResume()가 호출될때에는
@Override
protected void onResume() {
// TODO Auto-generated method stub
if(MainScreen.bgmOnOff == true){
if (!MusicService.player.isPlaying()) {
MusicService.player.start();
}
}
super.onResume();
}
이렇게 호출해서 Home키를 누르더라도 BGM을 멈추고 재생할 수 있습니다. 여기서의 문제는
액티비티를 이동할때
1번 액티비티 onResume() { 재생 } → onPause() { 일시정지 } ▷ 2번 액티비티 onResume() { 재생 } → onPause() { 일시정지 }
▷ 3번 액티비티.....4번...
이런식으로 작동하게 되므로 Home키에는 대응할 수 있으나 액티비티를 이동할때마다 끊김현상이 나타납니다.
그래서 제가 궁금한점은...
여러개의 액티비티가 있는 앱에서 Home키시에 BGM(서비스나 static변수)을 제어 할수 있고 액티비티 전환시 BGM이 끊기지 않는 방법을 알고 싶습니다.
오랫동안 이문제를 고민해 보았지만 찾지 못했습니다.
다른 좋은 방법이 있으면 알려주시면 감사하겠습니다.




서비스에서 mp3를 재생시키도록 하고,
BGM이 시작되어야 할 시점에서 서비스를 구동시키고(startService())
BGM이 중지되어야 할 시점에서 서비스를 정지시키고(stopService())
뭐 이렇게 하면 Activity전환과 관계없이 매끄러운 BGM이 나올듯합니다...
다른 더 좋은 방법이 있는지는 모르겠네요...