안드로이드에서 장기 실행 백그라운드 작업 관리하기
안드로이드에서 장기 실행 백그라운드 작업 관리하기
안드로이드는 장기 실행 백그라운드 작업을 처리하기 위한 다양한 메커니즘을 제공합니다. 이러한 메커니즘은 시스템 리소스를 효율적으로 사용하면서도 최신 OS의 백그라운드 실행 제한 정책을 준수하도록 설계되어 있습니다. 작업의 성격, 긴급도, 그리고 앱 생명주기와의 상호작용에 따라 적절한 방법을 선택해야 하며, 이 선택이 곧 앱의 안정성과 사용자 경험을 좌우합니다. 이 레슨을 학습하시면 다음과 같은 내용을 이해하실 수 있습니다.
WorkManager,Service, 코루틴,JobScheduler를 각각 언제 사용해야 하는지 설명할 수 있습니다.WorkManager가 제약 조건(constraints) 하에서 어떻게 작업 실행을 보장하는지 이해할 수 있습니다.- 포그라운드
Service가 왜 지속적 알림(persistent notification)을 필요로 하는지 설명할 수 있습니다. - 생명주기에 바인딩된 코루틴 스코프와 영속적 작업 메커니즘의 차이점을 비교할 수 있습니다.
- 작업의 영속성, 긴급도, 생명주기 요구사항에 따라 올바른 도구를 선택할 수 있습니다.
영속적 작업을 위한 WorkManager
앱이 종료되거나 기기가 재부팅된 이후에도 반드시 실행되어야 하는 작업에는 WorkManager가 가장 적합합니다.
WorkManager는 백그라운드 작업을 관리하며, 네트워크 연결 상태나 충전 여부 같은 제약 조건이 충족될 때 작업이 실행되도록 보장합니다.
class UploadWorker(
appContext: Context,
workerParams: WorkerParameters
) : Worker(appContext, workerParams) {
override fun doWork(): Result {
uploadData()
return Result.success()
}
}
// 네트워크 연결 시에만 작업 실행되도록 제약 조건 설정
val workRequest = OneTimeWorkRequestBuilder<UploadWorker>()
.setConstraints(
Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
)
.build()
// WorkManager에 작업 요청 등록
WorkManager.getInstance(context).enqueue(workRequest)
WorkManager는 작업 요청을 내부 데이터베이스에 저장하기 때문에, 앱이 종료되거나 기기가 재부팅되더라도 작업이 유실되지 않습니다. 일회성 작업(one-time work)과 주기적 작업(periodic work) 모두 지원하며, 여러 작업을 체이닝하거나 LiveData 또는 Flow를 통해 작업 상태를 관찰할 수도 있습니다. 실무에서는 서버 동기화, 로그 업로드, 주기적인 데이터 정리 등에 주로 활용됩니다.
지속적 실행이 필요한 작업을 위한 Service
음악 재생이나 위치 추적처럼 지속적으로 실행되어야 하는 작업에는 Service가 적합합니다. Service는 UI와 독립적으로 실행되며, 포그라운드 Service의 경우 사용자에게 앱이 백그라운드에서 작업 중임을 알리는 지속적 알림(persistent notification)을 반드시 표시해야 합니다.
class MyForegroundService : Service() {
override fun onStartCommand(
intent: Intent?, flags: Int, startId: Int
): Int {
// 포그라운드 서비스 시작 시 반드시 알림을 표시해야 합니다
startForeground(NOTIFICATION_ID, createNotification())
performLongRunningTask()
return START_NOT_STICKY
}
override fun onBind(intent: Intent?): IBinder? = null
}