안드로이드에서 백그라운드 작업을 실행하기 위해서는 Service를 이용해야 하며 Service은 사용자 인터페이스 즉 화면을 제공하지 않는다.
사용자에게 서비스 사용중임을 알람창으로 나타내 준다. 사용자와 상호작용이 필요한 작업이 백그라운드에서 실행되어야 할 때 사용하기 적합하다. (음악 앱 플레이어)
사용자에게 백그라운드 서비스가 실행하는건에 대한 알림이 없다. 사용자의 주목이 필요하지 않은 작업을 하기에 적합하다. (데이터 동기화, DB정리)
서비스와 액티비티간의 상호작용을 담당한다. 바인딩을 사용하면 서비스의 메서드를 직접 호출 할 수 있으며 서비스의 상태나 데이터에 접근 할 수 있다.(양방향 통신)
또한 서비스의 생명주기를 액티비티와 함께하게해 액티비티 종료시 서비스도 종료되게 할 수 있다.
사용 예시 > 음악앱에서 서비스에서 노래 변경시 이 정보를 바인딩된 액티비티에 전달하여 액티비티의 화면 UI를 현재 음악에 맞게 업데이트 할 수 있다.
서비스가 처음 생성되었을때 호출되는 1회성 메서드
즉, 서비스 실행 이전 onStartCommand(), onBind()호출시 onCreate()가 먼저 호출됨
startService()로 서비스를 호출할때 실행되는 메서드
이 메서드는 Service를 통해 수행하려는 작업을 정의하고 실행한다
리턴값으로는 Service 동작 방식을 리턴한다
START_STICKY
시스템으 서비스를 강제종료 해도 Service를 다시 시작한다. Intent는 이전에 넘겼던 Intent 가 다시 실행된다.
START_NOT_STICKY
시스템 종료 후에 다시 시작하지 않도록 요청한다.
START_REDELIVER_INTENT
START_STICKY와 같이 중단후 다시 시작하고 중단된 작업을 이어서 수행할 수 있다는 차이가 있다.
START_STICKY_COMPATIBILITY
이전 버전의 Android와의 호환성을 유지하기 위해 사용 START_STICKY와 유사
bindSercvice()를 사용하여 Service에 연결할 때 호출됨
리컨값으로 IBinder객체를 반환하지만 다른 앱과 상호작용하지 않는 경우 null값을 리턴할 수 있다.
서비스를 소멸시킬때 실행되어 서비스가 마지막으로 호출하는 메서드이다.
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() {
// 서비스가 종료될 때 호출되는 메서드
}
}
<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/