마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

포그라운드 서비스 유지에 대한 질문...

0 추천

 안녕하세요. 초보 개발자 입니다. ㅜ.ㅜ

제가 할려는 기능은...아래와 같구요.

1. 액티비티에서 버튼을 누르면 포그라운드 서비스 실행하여 알림창에 떠 있는 상태로 전환

     .....

  - ContextCompat.startForegroundService(this, startIntent);  로 서비스 실행

2. 한번 실행되면 폰 상태에 상관없이 60초 간격으로 특정 URL을 호출하여 값 가져오기

  -  서비스에서 쓰레드를 생성하고 그 안에서 while문으로 {실행, 60초 슬립}

 

[테스트 환경]

1. 테스트폰 노트9(8.1)

2. 화면 끔, 비충전 상태

3. 절전 대상이 아닌 앱 등록

 

[증상]

1. 초기 2~3회는 정확히 60초 주기로 반복하다가, 일정 횟수가 지나면 반복 시간이 안 맞거나 멈춤

 

제가 서치해본걸론 포그라운드로 서비스를 실행하면 항상 실행된다고 알고 있었는데

실제론 그렇지 않네요. ㅜ.ㅜ

(알람매니저나 잡스케줄러, 워크매니저등으로도 테스트 해봤는데...증상은 위와 비슷합니다.)

mp3플레이어처럼 포그라운드로 띄우기면 하면 될줄 알았는데....안되네요..

고수님들 조언 부탁드립니다. (_ _);;

 

착실이 (860 포인트) 님이 2019년 1월 31일 질문
착실이님이 2019년 1월 31일 수정

2개의 답변

0 추천
똑같은 방식으로 테스트 해봤는데, 저는 1초에 한번씩 정확하게 되는게 보이네요.

 

액티비티에서 서비스 실행 -> 서비스 1초에 한번씩 로그찍음 -> 정상 작동

액티비티에서 서비스 실행 -> 서비스에서 1초에 한번씩 특정 RestApi 호출 -> 정확하게 1초에 한번씩은 아니지만, 멈추거나 하지는 않습니다.
뱅구다 (11,280 포인트) 님이 2019년 2월 1일 답변
0 추천
sleep으로 살아나는 시간은  시스템 타이머와 스케줄러에 달려 있는데 doze 모드로 동작되는 것으로 생각됩니다.

https://blog.yatopark.net/doze-%EB%AA%A8%EB%93%9C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0/

https://code.i-harness.com/ko-kr/q/1efcce2 를 참조하시고,

 

가급적이면 sleep으로 쉬지 마시고 handler.sendMessageDelayed 같은 걸 사용해서, 일정 딜레이 이후 원하는 동작을 하도록 변경하시는 걸 권장합니다.
익명사용자 님이 2019년 2월 1일 답변
링크 참조해서 기존 소스 수정해서 해보고...
handler.sendMessageDelayed 도 참조해서 해봤는데 모두 안되네요. ㅜ.ㅜ;;;
...