
마시멜로(6.0) 부터 배터리 최적화를 위해 doze 모드와 app standby 모드가 도입되어 많은 안드로이드 개발자들이 고난을 겪어왔다.
Doze 진행 시 제한되는 항목
app standby 진행 시 제한되는 항목
이러한 제한은 베터리 소모를 줄이는 데 효과적이지만 백그라운드에서 통신 작업을 해야하는 앱을 개발한 개발자들은 이를 고려하여 설계를 해야하기에 매우 까다로운 존재라고 할 수 있다.
필자의 경우도 백그라운드에서 해당 단말기의 좌표값을 서버로 계속 보내야하는 핵심 기능을 유지하기 위해 방법을 고민해야만 했다.
찾아본 바 개발자가 대응할 수 있는 방법은 다음과 같았다.
- WorkManager를 사용하여 효율적인 백그라운드 작업 설계
- FCM의 높은 우선순위 메시지를 통해 중요한 알림을 처리
- 정기적으로 사용자가 앱을 열 수 있도록 유도
- 앱의 기능을 중요도에 따라 분류하고, 상황에 따라 분리
- 앱을 화이트리스트에 등록시켜 배터리 사용 최적화 모드를 제외
이 중에서 지속적인 통신을 위해 선택한 방법은 5번이었다.
Intent intent = new Intent();
intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + getContext().getPackageName()));
startActivity(intent);
앱 시작 시 다이얼로그로 사용자에게 배터리 사용량 최적화 제외 관련 동의를 받고, 화이트리스트에 등록을 시키게 되면 백그라운드에서 통신을 문제없이 보낼 수 있다.
하지만 REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 퍼미션이 선언 된 앱은 Google Play 에 앱 등록시 거부될 수도 있다.
(https://developer.android.com/training/monitoring-device-state/doze-standby#whitelisting-cases)