본문 바로가기
Android

Foreground Service 사용해보기

by kkong93 2022. 8. 10.
반응형

서비스 개요

서비스는 백그라운드에서 꺼지지 않고 작업을 수행하는 안드로이드 4대 구성요소 중 하나. 서비스는 독립된 구성요소이기 때문에 독립된 생명 주기를 가진다. 액티비티가 소멸되더라도 서비스는 독립된 상태로 실행이 되고 있어서 다시 액티비티를 생성하여 해당 서비스와 소통할 수도 있다.

 

서비스 유형은 세가지로 나눌 수 있다

  • 백그라운드 
  • 포그라운드 : 예를 들면 뮤집 앱에서 음악을 재생할 때와 같이 상태 표시줄에 알림이 표시되며 유저가 서비스가 실행되고 있음을 인지할 수 있는 서비스. 
  • 바인드  

 

 

실제 사용방법

 

1. 포그라운드 퍼미션 요청하기

<manifest xmlns:android="http://schemas.android.com/apk/res/android" ...>

    <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>

    <application ...>
        ...
    </application>
</manifest>

Android 9 이상을 대상으로 하는 앱에 대해 포그라운 서비스 권한을 등록해줘야한다. (백그라운드 서비스를 사용하고 유저가 해당 사실을 모르면 기기에 성능 저하가 나타나기 때문)

startForegroundService() 함수와 startService()의 다른 점 : startForegroundService() 함수 호출 뒤 5초 이내에 startForeground() 함수를 통해 알림을 보여주어야 함.

 

 

 

 

 

2. Service 정의 + Manifest에 정의하기

class MusicPlayerService : Service() {
    var mediaPlayer: MediaPlayer? = null
    var binder :MusicPlayerBinder = MusicPlayerBinder()


    inner class MusicPlayerBinder : Binder() {
        fun getService(): MusicPlayerService {
            return this@MusicPlayerService
        }
    }

    override fun onCreate() {
        super.onCreate()
        startForegroundService()
    }

    override fun onBind(intent: Intent): IBinder {
        return binder
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        return super.onStartCommand(intent, flags, startId)
    }

    override fun onDestroy() {
        super.onDestroy()
    }
    
    fun startForegroundService(){}
    
    fun isPlaying(){}
    
    fun play(){}
    
    fun stop(){}
}
  • onCreate() : 서비스가 생성될 때 딱 한 번만 실행되는 함수. 여기서 알림을 생성하는 startForegroundService()를 실행
  • onBind() : 액티비티와 같은 구성요소에서 bindService() 함수를 호출할 때 실행되는 함수. 서비스와 구성요소를 이어주는 IBinder를 반환함. 바인드가 필요없는 서비스면 null을 반환하면 된다.
  • onStartCommand() : startService()를 호출하면 실행되는 콜백 함수. 반드시 정숫값을 반환해야 한다. 
    • START_STICKY : 시스템이 호출을 중단하면 서비스를 다시 실행하고 onStartCommand() 함수를 호출한다.
    • START_NOT_STICKY : 시스템이 호출을 중단하면 서비스를 재생성하지 않는다
    • START_REDELIVER_INTENT : 시스템이 호출을 중단하면 서비스를 다시 실행하고 onStartCommand() 함수를 호출한다. 서비스 종료 전 마지막으로 전달된 인텐트를 재전달한다. -> 반드시 명령을 실행해야 하는 경우에 쓰임.
<application>
    ...

    <service android:name=".MusicPlayerService" />

</application>

 

 

 

 

 

3. 알림 채널, 알림 서비스 종료 기능 구현

fun startForegroundService() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
            val channel = NotificationChannel("ID", "NAME", NotificationManager.IMPORTANCE_DEFAULT)
            notificationManager.createNotificationChannel(channel)
        }

        val notification = Notification.Builder(this, "ID")
            .setContentTitle("뮤직 플레이어 앱")
            .setContentText("앱이 실행중입니다.")
            .build()

        startForeground(1, notification)
    }

알림을 만든 후 startForeground(1, notification)으로 서비스를 포그라운드 서비스로 만든다. 첫 번째 인수로는 0이 아닌 정숫값을 넘겨 알림의 식별자로 사용한다.

   override fun onDestroy() {
        super.onDestroy()
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            stopForeground(true)
        }
    }

서비스가 중단될 때 stopForeground(true)함수를 사용하여 포그라운드 서비스를 멈춘다.

 

 

 

 

 

 

4. Activity 또는 Fragment에서 서비스 실행해주기

 Intent(applicationContext, MusicPlayerService::class.java).run {
                        startForegroundService(this)
                    }

종료

Intent(applicationContext, MusicPlayerService::class.java).run {
                        stopService(this)
                    }

 

 

 

 

 

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

 

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

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

developer.android.com

 

반응형

댓글