안드로이드 4대 컴포넌트 (액티비티, 서비스, 리시버, 프로바이더) 중 서비스를 알아보자
서비스를 처음 다뤄본건 "무슨 일이 있어도 BLE 통신이 살아있게 해주세요"라는 요구사항을 받았을때였다. 조금 더 풀어보자면 스타트업 인턴 당시 받은 첫번째 과제는 다음과 같았다.
해외 전시회에 비즈니스 목적으로 부스를 운영한다.
회사의 신제품인 전기자전거용 자전거 속도계를 시연할거다.
전기자전거를 들고 해외를 갈 순 없지 않냐.
그러면 인턴 너가 전기자전거의 신호를 흉내내서 블루투스 통신을 보내는 안드로이드 앱을 만들어라.
근데 부스 운영 해야하니까 백드라운드 가서도 안꺼지게 해달라.
위 내용을 조금 더 개발 용어로 바꿔보자면 다음과 같다.
기기를 잠금하고 다시 돌아온 상태나 포커싱이 없는 상태에서도 subscriber에게 ble notification이 가도록 하라
조금 해석해보자면 다음과 같다.
앱이 임베디드 장비(자전거속도계 프로토타입)한테 신호를 보내는 것을 notification이라고 한다.
포커싱이 없는 상태는 onStop 상태를 의미한다.
= onDestroy가 아닌 모든 상태에 BLE 통신이 되야한다는 것을 의미한다.
그렇게 하기 위해서 startForeground
라는 것을 알아냈다. 그러기 위해서는 4대 컴포넌트 중 하나인 Service
를 상속 받는 형태로 만들어야한다.
부모 클래스인 Service
의 함수 중 startForeground()
를 오버라이드 하고, 좀비처럼 살아있게 하고 싶은 작업을 해당 함수 안에서 지정해주면 된다.
그렇게 하면, 내가 원하는 작업이 포그라운드 서비스로 지정함으로써 사용자가 앱과 사용작용하지 않을 때도 계속 실행된다.
class BluetoothService(
context: Context,
bikeViewModel: BikeViewModel
) : Service() {
// .. 중간 생략 ...
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
val notification = createNotification() // Notification 생성
startForeground(1, notification) // Foreground 서비스 시작
return START_STICKY // 서비스가 중단되었을 경우 자동으로 다시 시작
}
그리고 하나 더, manifest에 가서 등록을 해줘야합니다.
<service
android:name=".bluetooth.BluetoothService"
android:foregroundServiceType="dataSync" />