: startService는 독립적인 서비스를 실행시키는 함수로, 이를 호출한 컴포넌트에 독립적으로 작동하며 stopSelf 또는 stopService로 종료시켜줘야 한다.
: 반면 bindService는 해당 컴포넌트에 묶여, 작동하므로 activity가 종료되면 같이 destory된다.

START_STICKY: 프로세스에 의해 kill된 이후 재시작을 보장하는 상수 값. 만약, kill된 상황에서 다른 컴포넌트가 다시 서비스를 실행시키거나 시키지 않을 수 있다. 시키지 않은 경우, kill 상황에서 intent를 따로 보존하지 않기 때문에 null intent를 넣어 startServiec를 하기 때문에 if (intent == null)과 같은 방어 코드가 필요하다. 반면, 새롭게 다시 실행시키면 해당 intent를 사용하고, 작업 큐에 있던 re-start 서비스 작업은 없앤다.
START_STICKY_COMPATIBILITY: 위와 동일하게 작동하지만, 재시작을 보장하지 않는다.
START_NOT_STICKY: 명시적으로 intent가 있을 경우, 즉 startService, bindService 등을 호출한 경우에만 서비스를 실행시킬 수 있음. 즉, restart 자체는 되지 않고, 명시적으로 다시 start 또는 bind 시켜야 작동
START_REDELIVER_INTENT: START_STICKY와 같지만 restart 시 동일한 intent가 전달되어 재시작됨.
그 밖....(AI로 정리)
1. 프로세스 우선순위 제어
- BIND_NOT_FOREGROUND: 클라이언트가 포그라운드에 있더라도, Service 프로세스를 포그라운드 수준으로 승격시키지 않습니다.
- BIND_ABOVE_CLIENT: 시스템에게 "이 Service 프로세스가 나(클라이언트)보다 더 중요하다"고 명시적으로 알립니다.
- BIND_WAIVE_PRIORITY: 클라이언트의 존재가 Service 프로세스의 우선순위에 어떠한 영향도 미치지 않게 합니다.
- 디버깅 목적
- BIND_DEBUG_UNBIND: 클라이언트가 unbindService()를 호출하지 않고 종료될 경우, 시스템 로그캣에 바인딩 당시의 Call Stack Trace를 강제로 출력합니다.
class LocalService : Service() {
// Binder given to clients.
private val binder = LocalBinder()
// Random number generator.
private val mGenerator = Random()
/** Method for clients. */
val randomNumber: Int
get() = mGenerator.nextInt(100)
inner class LocalBinder : Binder() {
// Return this instance of LocalService so clients can call public methods.
fun getService(): LocalService = this@LocalService
}
override fun onBind(intent: Intent): IBinder {
return binder
}
}