골치아픈 백그라운드 프로세스 관리 workmanager로 한방에 해결할수 있다면?
이번에 소개해볼 구성요소는 Android Jetpack의 WorkManager 입니다
비동기적으로 특정 작업에 대한 스케줄링이 필요할때 사용되는 구성요소 입니다.
이미 존재하고 있는 JobScheduler, AlarmManager의 상위호환 버전입니다.
백그라운드 프로세스를 만들때는 꽤나 염두해두어야할것들이 있습니다.
이 프로세스가 동작하게될 OS가 어느버전인지, 앱이 실행중인지 아닌지 등등 말이죠
WorkManager는 백그라운드 태스크를 수행할때
가장 적절한 방법을 찾아서 그 작업을 수행합니다.
개발자의 입장에서는 이 백그라운드 태스크가 실행될 환경이나 상황은 고려하지 않고
실제로 동작해야할 코드에만 집중하면 됩니다.
코드의 동작은 WorkManager가 보장하니깐요
백그라운드에서 코드가 실행될수 있는 가장 적합한 시간이나 장소, 위치는 WorkManager가 고르게 됩니다.
개발자가 직접 동작해야할 제약조건등을 매우 쉽게 지정할수 있습니다.
setRequiresCharging
setRequiresBatteryNotLow
setRequiredNetworkType
충전중인지, 배터리가 넉넉히 있는지, 네트워크에 연결이 되어있는지 등 간편하게 적용할수 있는 조건 옵션들이 있습니다.
실제로 동작해야할 코드가 담겨있는 Worker 클래스가 존재하구요
이 Worker 클래스가 동작하도록 작업을 요청하는 WorkRequest 가 있습니다
그리고 WorkRequest를 등록하고 관리하는 WorkManager 가 존재합니다.
work마다 id가 부여되고 직접 태그를 설정할수도 있어서 이를 이용해서 등록한 작업의 취소도 가능하구요
당연히 일정한 시간을 주기적으로 수행해야하는 작업 역시 가능합니다. (PeriodicWorkRequest)
중복해서 등록되지 않도록 유니크하게 태스크를 등록할 수도 있습니다.(enqueueUniquePeriodicWork)
프로세스가 돌고 있는지 확인하는식으로 구현을 해도 되겠지만 이 방법이 좀 더 구현하기에 편합니다.
그외 장점으로는
1. boot receiver 등록안해도됨
alarm manager로 백그라운드 스케줄을 만드는 경우에는
폰의 재부팅시에 스케줄이 취소가 되기 때문에
boot receiver를 구현해서 다시 스케줄을 등록해주는 코드를 작성해야되는데요
workmanager는 재부팅시에도 자동적으로 동작하기 때문에 별도의 코드를 작성해주지 않아도 됩니다.
2. rxjava2 를 지원
Worker를 일반적인 Worker 클래스를 구현해도 되지만
RxWorker 클래스를 구현해도 됩니다.
구현한 worker는 동일한 방법으로 workmanager에 등록하면 됩니다.
그외 단점
1. 15분 제한
코드를 주기적으로 동작시키는 PeriodicWorkRequest는 최소 15분의 minimum interval 제약조건이 있습니다.
그래서 이보다 짧은 시간을 interval로 해야한다면 다른 대안을 찾으셔야 합니다.
개발용으로는 짧은 interval을 쓰고 싶은데
같은 코드를 활용할수 없으니 이점은 조금 아쉽네요.
그외 주의해야할 사항으로는
유니크한 태스크를 등록하는 경우에 (enqueueUniquePeriodicWork)
유니크함을 구분하는 키가 파라메터로 넣게되는 WorkName이고,
함께 넣는 파라메터가 실행될 workrequest인데요
work request의 조건이 변경될때(제약조건이나, 주기 등) workname이 그대로라면
ExistingPeriodicWorkPolicy.KEEP 정책이라면 바뀐 조건이 적용이 되지 않습니다.
그렇기때문에 이름을 바꿔서 해주거나 REPLACE로 정책을 바꾸던가해야합니다.
다음번에는 간단하게 구현한 코드도 포스팅해보겠습니다.