본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


기타/Android

안드로이드 Doze모드

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2019. 4. 30.

 

 

안드로이드 6.0 이상부터 Doze모드라는게 생겼다.
해당 기능은 베터리 사용을 최대한 효율적으로 관리해주는 사용자 입장에서 멋진 기능이다.

예를들어 충전기가 꽂혀있지 않거나, 핸드폰 화면이 꺼져 있거나, 앱을 종료한 상태 등등..사용자가 핸드폰에 어떠한 행동을 하지 않는 상태가 되면 베터리사용을 효율적으로 해 주기 위해서 동작중인 왠만한 서비스를 중지시켜버리는 기능이다..마치 IOS처럼..

그런데..해당 기능이 발동하면 프로그래머 입장에서는 골치아파 진다.
예를들어,
어떠한 백그라운드 서비스를 지속적으로 돌려야 하는 입장에서,
도즈모드가 발동하면 해당 백그라운드 서비스가 안드로이드 테스커에 의해서 강제로 종료되거나 서비스가 늦춰지게 된다.

이에, 이를 해결하기 위해서는 AlarmManager나 JobScheduler를 활용하라고 명시되어 있다.
또는 앱을 WhiteList로 추가하여 안드로이드가 죽이지 않도록 등록하는 방법도 있다.

하지만, 이러한 방법을 아무리 적용 하더라도,
동작 기간이 짧은 백그라운드 서비스는 강제로 종료되거나 늦춰지게 된다.
가령 1분에 한번씩 어떤 서버에 TCP/IP 통신을 해야되는 앱이 있다고 한다면, 해당 서버에 접속하는 스케줄링 기능이 처음에는 1분이었지만 점점..
1분이 2분, 3분, 10분..30분이 되는 상황을 볼 수있다.

이에, 안드로이드에서는 FCM을 활용하여 기능을 구현하라고 명시되어있다..
https://firebase.google.com/docs/cloud-messaging/?hl=ko

 

아래 스케줄러 코드는 5초에 한번 씩 동작을 하도록 만든 코드이다.
하지만 동작을 시키면 시킬수록 지연시간이 30분까지 늘어나는 점은 안드로이드 정책 상 해결이 어려워 보인다. 
2~3일정도 테스트 해 보았으나..역시 최대 30분까지 딜레이를 가져버린다.

* 결국 안드로이드 9.0에서는 제대로 되지 않는다. (수정)

 

       ComponentName componentName = new ComponentName(this, 실행시킬클래스.class);
        JobInfo jobInfo = new JobInfo.Builder(등록할 스케줄ID값(int형태), componentName)
                .setBackoffCriteria(1000 * 5 * 1 ,JobInfo.BACKOFF_POLICY_LINEAR)
                .setPersisted(true)
                .setMinimumLatency(1000 * 5 * 1)
                .setOverrideDeadline(1000 * 5 * 1)
                .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY).build();
        jobScheduler.schedule(jobInfo);


* 추가
  - Doze모드가 2가지타입이 있는데..완전 슬립에 들어가면..이것도 작동 안해버린다..하하....
  - White List에 등록하는게 답인가 싶다..Doze모드 완전 슬립에서는 FCM도 안된다..ㅠ
  -백그라운드에서 무언가 tcp/ip를 하고 싶다면 이제는 포그라운드나 fcm을 사용하는 수 밖에 없는 것 같다. 정책이 IOS 처럼 바뀌어서 카톡개발자(?)수준이 아닌이상 해결하기 힘들 것 같다.
  - 그리고 안드로이드 9.0부터는 백그라운드에서 tcp/ip 통신을 막는다. 아마도 안드로이드 10이상으로 넘어가는 순간 또 다른 제약조건을 걸지 않을 까 싶다.

반응형

'기타 > Android' 카테고리의 다른 글

플레이 스토어 일시 정지  (0) 2019.04.30
안드로이드 앱 아이콘 변경  (0) 2019.04.30
안드로이드 8.0부터 Notifications 사용  (0) 2019.04.30
안드로이드 doze모드 만들기  (0) 2019.04.30
안드로이드 Badge Count  (0) 2019.04.29
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글