[Android] Service에 대해 알아보자

유진·2025년 8월 8일
0

Android

목록 보기
6/8
post-thumbnail

안드로이드 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" />

코드 전문 https://github.com/HI-JIN2/virtual-bicycle-with-ble/blob/master/app/src/main/java/com/eddy/nrf/bluetooth/BluetoothService.kt

profile
안드로이드... 좋아하세요?

0개의 댓글