Android Component 중 하나인 Service에 관한 예제이다.
Service는 크게 바인딩이 되었는지 혹은 스타트 되었는지 나눌 수 있지만 양 쪽 방식으로 작동할 수도 있다.
이번 글은 바인딩이 아닌 startService() 메서드를 통해 시작되는 서비스에 관한 예제이다.
1. Service 생성
새 프로젝트를 만들어서 서비스를 생성한다.
class RingtoneService : Service() {
override fun onBind(intent: Intent): IBinder {
TODO("Return the communication channel to the service.")
}
}
Ringtone을 이용할 것이기 때문에 RingtoneService로 지었다.
2. 이번 예제에서는 바인딩을 사용하지 않기 때문에 onBind에서 null을 리턴한다.
override fun onBind(intent: Intent): IBinder? {
return null
}
3. onStartCommand()
다른 Component에 의해 서비스가 시작되면 onStartCommand() 메서드가 실행되기 때문에 onStartCommand()를 override해줘서 service가 시작되면서 실행할 내용을 작성해준다.
class RingtoneService : Service() {
private lateinit var mediaPlayer: MediaPlayer
override fun onBind(intent: Intent): IBinder? {
return null
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
mediaPlayer = MediaPlayer.create(this@RingtoneService, Settings.System.DEFAULT_RINGTONE_URI)
mediaPlayer.isLooping = true
mediaPlayer.start()
return START_STICKY
}
}
Ringtone을 재생하기 위한 MediaPlayer를 lateinit로 선언하여 onStartCommand에서 초기화해준다.
반복을 위해 isLooping을 true로 하고 생성된 mediaPlayer를 start하는 코드이다.
그리고 마지막으로 START_STICKY 라는 값을 리턴해주는데
START_STICKY는 시스템이 서비스를 종료하면 다시 재생성해준다.
그에 반해 START_NOT_STICKY을 리턴값으로 한다면 재생성하지 않는다.
4. service가 종료될 때 호출되는 onDestroy()메서드롤 override해준다.
class RingtoneService : Service() {
private lateinit var mediaPlayer: MediaPlayer
override fun onBind(intent: Intent): IBinder? {
return null
}
override fun onDestroy() {
super.onDestroy()
mediaPlayer.stop()
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
mediaPlayer = MediaPlayer.create(this@RingtoneService, Settings.System.DEFAULT_RINGTONE_URI)
mediaPlayer.isLooping = true
mediaPlayer.start()
return START_STICKY
}
}
서비스가 종료될 때 실행중인 mediaPlayer도 종료를 하기 위해 mediaPlayer.stop()를 작성한다.
5. Activity에서 startService()를 실행한다.
startService(Intent(this, RingtoneService::class.java))
서비스를 실행하면 Ringtone이 반복하여 재생한다. 뒤로 가기로 app을 종료해도 계속해서 재생되는 걸 확인할 수 있다.
[Github]
[참고]
https://developer.android.com/guide/components/services?hl=ko
https://stackoverflow.com/questions/9093271/start-sticky-and-start-not-sticky
'Android > 공부노트' 카테고리의 다른 글
[안기단] 4. Content Provider (0) | 2022.05.31 |
---|---|
[안드로이드] 서비스 - 최근 앱 목록에서 앱을 닫는다면? (0) | 2022.05.19 |
[안기단] 3. Broadcast Receiver (0) | 2022.05.17 |
[안기단] 2. Service (0) | 2022.04.12 |
안드로이드 Jetpack Compose - 4 (0) | 2022.04.12 |
댓글