Android | Service

이동욱·2023년 11월 23일
0

Service란?

안드로이드에서 백그라운드 작업을 실행하기 위해서는 Service를 이용해야 하며 Service은 사용자 인터페이스 즉 화면을 제공하지 않는다.

종류

1. 포그라운드

사용자에게 서비스 사용중임을 알람창으로 나타내 준다. 사용자와 상호작용이 필요한 작업이 백그라운드에서 실행되어야 할 때 사용하기 적합하다. (음악 앱 플레이어)

2. 백그라운드

사용자에게 백그라운드 서비스가 실행하는건에 대한 알림이 없다. 사용자의 주목이 필요하지 않은 작업을 하기에 적합하다. (데이터 동기화, DB정리)

3. 바인딩

서비스와 액티비티간의 상호작용을 담당한다. 바인딩을 사용하면 서비스의 메서드를 직접 호출 할 수 있으며 서비스의 상태나 데이터에 접근 할 수 있다.(양방향 통신)

또한 서비스의 생명주기를 액티비티와 함께하게해 액티비티 종료시 서비스도 종료되게 할 수 있다.

사용 예시 > 음악앱에서 서비스에서 노래 변경시 이 정보를 바인딩된 액티비티에 전달하여 액티비티의 화면 UI를 현재 음악에 맞게 업데이트 할 수 있다.

생명주기 & 매서드

1. onCreate()

서비스가 처음 생성되었을때 호출되는 1회성 메서드
즉, 서비스 실행 이전 onStartCommand(), onBind()호출시 onCreate()가 먼저 호출됨

2. onStartCommand(intent: Intent?, flags: Int, startId: Int) : Int

startService()로 서비스를 호출할때 실행되는 메서드
이 메서드는 Service를 통해 수행하려는 작업을 정의하고 실행한다
리턴값으로는 Service 동작 방식을 리턴한다

  1. START_STICKY

    시스템으 서비스를 강제종료 해도 Service를 다시 시작한다. Intent는 이전에 넘겼던 Intent 가 다시 실행된다.

  2. START_NOT_STICKY

    시스템 종료 후에 다시 시작하지 않도록 요청한다.

  3. START_REDELIVER_INTENT

    START_STICKY와 같이 중단후 다시 시작하고 중단된 작업을 이어서 수행할 수 있다는 차이가 있다.

  4. START_STICKY_COMPATIBILITY

    이전 버전의 Android와의 호환성을 유지하기 위해 사용 START_STICKY와 유사

3. onBind(intent: Intent): IBinder?

bindSercvice()를 사용하여 Service에 연결할 때 호출됨

리컨값으로 IBinder객체를 반환하지만 다른 앱과 상호작용하지 않는 경우 null값을 리턴할 수 있다.

4. onDestory()

서비스를 소멸시킬때 실행되어 서비스가 마지막으로 호출하는 메서드이다.

예시

class MyService : Service() {
    private var startMode: Int = 0       // 서비스가 종료된 경우 동작 방식
    private var binder: IBinder? = null  // 서비스와 클라이언트 간 통신을 위한 인터페이스

    override fun onCreate() {
        // 서비스가 생성될 때 호출되는 메서드
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        // startService() 메서드를 통해 서비스가 시작될 때 호출되는 메서드
				// startService(intent)를 통해 보낸 intent는 onStartCommand에서 받을 수 있다.
        return startMode
    }

    override fun onBind(intent: Intent): IBinder? {
		    // Service 연결시 호출   
        return binder
    }

    override fun onDestroy() {
        // 서비스가 종료될 때 호출되는 메서드
    }
}

service_lifecycle.png

매니페스트 선언하기

service manifest 가이드

<application>
		<service 
				android:description="string resource"
         android:directBootAware=["true" | "false"]
         android:enabled=["true" | "false"]
         android:exported=["true" | "false"]
         android:foregroundServiceType=["camera" | "connectedDevice" |
                                        "dataSync" | "health" | "location" |
                                        "mediaPlayback" | "mediaProjection" |
                                        "microphone" | "phoneCall" |
                                        "remoteMessaging" | "shortService" |
                                        "specialUse" | "systemExempted"]
         android:icon="drawable resource"
         android:isolatedProcess=["true" | "false"]
         android:label="string resource"
         android:name="string"
         android:permission="string"
         android:process="string" >
				...
		</service>
</application>

서비스 실행 & 종료

1. 시작

시작에는 startService()startForegroundService()두가지가 있다.

API26부터 백그라운드 앱이 백그라운드 서비스를 실행하는것을 허용하지 않기 때문에 startForegroundService()를 호출해야 한다.

또한 startForegroundService() 호출 후에는 5초이내 startForeground(int, Notification) 를 호출해야 한다. 그렇지 않으면 서비스는 종료된다.

// Service 실행코드
startService(Intent(this, MyService::class.java))
// API 26이상은
startForegroundService(Intent(this, MyService::class.java))

2. 종료

stopService()

// Service 종료코드
stopService(Intent(this, MyService::class.java))


참조
https://developer.android.com/guide/components/services?hl=ko
https://www.geeksforgeeks.org/services-in-android-with-example/

profile
프론트엔드

0개의 댓글