본문 바로가기
Android/공부노트

[안드로이드] 서비스 예제1 - start service

by ESHC 2022. 5. 18.

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가 시작되면서 실행할 내용을 작성해준다.

ctrl + O 를 통해 override 가능한 메서드들을 찾을 수 있다.(Window)

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://github.com/eshc123/AndroidComponentExample/blob/main/app/src/main/java/com/eshc/androidcomponentexample/service/RingtoneService.kt

 

GitHub - eshc123/AndroidComponentExample

Contribute to eshc123/AndroidComponentExample development by creating an account on GitHub.

github.com

 

[참고]

https://developer.android.com/guide/components/services?hl=ko 

 

서비스 개요  |  Android 개발자  |  Android Developers

서비스 개요 Service는 백그라운드에서 오래 실행되는 작업을 수행할 수 있는 애플리케이션 구성 요소이며 사용자 인터페이스를 제공하지 않습니다. 다른 애플리케이션 구성 요소가 서비스를 시

developer.android.com

https://stackoverflow.com/questions/9093271/start-sticky-and-start-not-sticky

 

START_STICKY and START_NOT_STICKY

What is the difference between START_STICKY and START_NOT_STICKY while implementing services in android? Could anyone point out to some standard examples.. ?

stackoverflow.com

 

댓글