Foreground Service On WearOS

Foreground service를 이용해 주기적으로 작업을 실행하려면 서비스 내에서 Timer, Handler, Coroutine 등 반복 실행 메커니즘을 직접 구현해야 합니다.

Foreground Service 개요

  • Foreground service는 반드시 사용자에게 알림(Notification)을 띄운 상태에서 장시간 실행할 수 있습니다.
  • 주로 음악 재생, 위치 추적, 운동 기록, 타이머 등 실시간성이 높은 작업에 적합합니다.

주기 실행 방식

  1. 서비스 내부에서 Timer/Handler 사용
    • 서비스의 onStartCommand() 내부에서 java.util.Timer, Handler, 또는 Kotlin Coroutine 등으로 반복 작업을 실행합니다.
    • 예시: 일정 간격마다 데이터를 수집하거나 네트워크 요청 등.
  2. 코드 예시 (Handler 사용)
kotlin

class MyForegroundService : Service() {
private val handler = Handler(Looper.getMainLooper())
private val interval = 10 * 1000L // 10초

private val runnable = object : Runnable {
override fun run() {
// 실행할 코드
doPeriodicTask()
handler.postDelayed(this, interval)
}
}

override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
startForeground(notificationId, createNotification())
handler.post(runnable)
return START_STICKY
}

override fun onDestroy() {
handler.removeCallbacks(runnable)
super.onDestroy()
}
}


  • 반드시 foreground 상태를 유지하며 명확한 알림이 계속 표시되어야 합니다.
  1. 주의 사항
  • 일부 Wear OS 기기 및 Android 14 이상에선 foreground service에도 추가 제한이 있으니, 작업 유형(타이머, 위치추적 등)을 명시하는 service type을 지정해야 합니다.
  • 기기가 Doze 모드 등 극단적 절전 상태에 진입하면 CPU가 완전히 off될 수 있으며, 이때는 wakelock을 사용해 CPU 깨어있음(CPU awake)을 유지해야 특정 1~2초 단위 작업이 중단되지 않습니다.

참고 구현 예시

  • Foreground timer 서비스 오픈소스 예시: ForegroundService_Timer에서는 알림과 함께 주기적으로 시간을 업데이트하는 구조를 사용합니다.

이처럼 foreground service 내부에서 직접 Timer/Handler 등 반복 실행 로직을 작성하면 주기적으로 작업을 실행할 수 있습니다. 다만 배터리와 알림 정책, wakelock 활용 등 몇 가지 필수 사항을 항상 함께 고려해야 합니다.

Back to top