포그라운드 서비스 : 서비스가 시작되면 액티비티가 종료되어도 서비스가 유지된다. (화면에 보이지 않음)
백그라운드 서비스 : 서비스가 시작되면 액티비티가 종료되어도 서비스가 유지된다. (화면에 보임)
바인드 서비스 : 서비스를 호출한 액티비티와 통신을 할 수 있게 해주며, 호출 액티비티가 전부 종료될 시 서비스가 종료된다.
서비스의 종류는 3가지가 있는데,
여기서 백그라운드 서비스를 활용하여 배경음악 재생을 할 수 있다.
사용해보기
서비스 생성하기
New -> Service 에서 서비스를 생성해준다.
서비스를 생성하면 Manifest 에 자동으로 등록된다.
서비스는 액티비티처럼 Manifest에 등록하여 사용하여야 한다.
레이아웃 만들기
테스트할 가벼운 레이아웃을 만들어 준다.
재생할 파일 추가하기
여기서는 파일을 추가하여 직접 재생하는 방법을 사용할 것이므로
res에서 New -> Android Resource Directory
Resource type을 raw로 해서 디렉토리를 생성해준다.
그곳에 재생하고싶은 음악 파일을 넣어준다.
MyService
class MyService : Service() {
lateinit var mp : MediaPlayer
override fun onBind(intent: Intent): IBinder {
// Service 객체와 통신할 때 사용
TODO("Return the communication channel to the service.")
}
// 서비스가 호출되었을 때 한번만 호출
override fun onCreate() {
super.onCreate()
mp = MediaPlayer.create(this,R.raw.carole)
mp.isLooping = false // 반복재생
}
// 서비스가 호출될때마다 호출 (음악재생)
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
mp.start()
return super.onStartCommand(intent, flags, startId)
}
// 서비스가 종료될 때 음악 종료
override fun onDestroy() {
super.onDestroy()
mp.stop()
}
}
OnStartCommand에서 재생시켜준다. OnStartCommand는 서비스가 호출될 때마다 호출된다.
그 후 서비스가 종료될 때 음악을 종료시켜준다.
MainActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
fun ServiceStart(view : View){
val intent = Intent(this,MyService::class.java)
startService(intent) // 서비스 시작
}
fun ServiceStop(view : View){
val intent = Intent(this,MyService::class.java)
stopService(intent) // 서비스 종료
}
}
startService를 하면 서비스를 생성하여 OnStartCommand 를 호출하여 음악을 재생하고,
stopService를 하면 onDestroy를 호출하여 음악을 종료시켜준다.
각각 버튼 클릭 시 메소드를 호출해준다.
실행하면 음악 재생, 종료가 잘 작동하며 텍스트 수정등 다른 행동을 해도 음악작동에 영향을 미치지 않는다.