버그 잡이

android 알람 앱 "어떤 service를 사용해야할까?" # 음악 재생 본문

안드로이드

android 알람 앱 "어떤 service를 사용해야할까?" # 음악 재생

버그잡이 2020. 4. 30. 10:22

나는 지금 알람앱을 만들고 있다.

알람이 시작되면 음악을 재생시켜야 하는데 '어떤 Service를 사용하는 것이 좋을까?'

결론부터 이야기하자면 아래와 같다.

 

 

startService() & foregroundService

 

 

 

내가 만들 서비스는 음악이 재생되는 서비스이고 세부 요구사항을 살펴보자

 

 

요구사항#1 : 음악 재생상태와 버튼 상태를 동기화시킬 필요가 없다. -> UI에 영향을 줄 필요가 없다.

 

요구사항#2 : 1분 이상 지속되어야 한다.

 

 

 

 

서비스의 종류

 

 

서비스는 위 그림처럼 크게 두가지 방법으로 나눠서 사용한다.

 

 

*startService()

 

- 백그라운드에서 실행되고, 한번 시작된 서비스는 stopService를 호출할때까지 계속 실행된다. 

- 하지만 작업 결과를 호출자에게 반환하지 않기 때문에, 호출자와 상호작용하는 작업에는 적합하지 않는다.

- 가장 간단한 기본적인 구현 방법이다.

 

 

*bindService()

 

- startService()와는 다르게 작업 결과를 호출자에게 전달할 수 있고 호출자에게서도 특정 결과를 받을 수 있다. 즉, 서로 상호작용할 수 있는 것이다.

- 바인딩을 하려면 ServiceConnection을 구현해야한다.

 

- ex) 음악 플레이어에서 '재생 버튼'과 '일시정지 버튼'을 음악 상황에 따라 변경 및 유지.

 

 

-> 내가 만들 앱의 경우 음악 재생 상태에 따라 버튼의 상태를 바꿀 필요가 없고 단순히 음악 재생만 하면 되기 때문에 startService()를 이용한 방식이 적합하다.(요구사항 #3)

 

 

 

 

 

ForegroundService

 

 

startService()로 서비스를 시작하면 stopService()가 호출될때까지 무기한 실행되는 것으로 알고 있었다.

그런데 실제로 동작시켜보니 한 10초 있다가 서비스가 강제 종료된다.

 

찾아보니 Oreo 이후 버전에서는 서비스를 백그라운드에서 실행하는 것을 금지하기 때문에 포그라운드(Foreground)

에서 실행해야한다.(요구사항#2)

 

class AlarmService : Service() {

    override fun onCreate() {
        if (Build.VERSION.SDK_INT >= 26) {
            val CHANNEL_ID = "my_channel_01"
            val channel = NotificationChannel(
                CHANNEL_ID,
                "Channel human readable title",
                NotificationManager.IMPORTANCE_DEFAULT
            )

            (getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager).createNotificationChannel(
                channel
            )

            val notification = NotificationCompat.Builder(this, CHANNEL_ID)
                .setContentTitle("")
                .setContentText("").build()

            startForeground(111, notification)
            
            //원하는 작업
        }
        else{
        
        	//원하는 작업
        }
    }
 }

 

*startForeground를 하기 위해서는 notification을 만들어줘야한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
Comments