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

AlarmManager로 등록한 Service가 설정한 간격마다 깨어나지 않습니다.

0 추천

AlarmManager 를 통해 1분에 한번 호출되어 Service를 실행하는 알람을 등록했습니다.

화면이 켜져있고 케이블이 연결되어 있으면 1분에 한번 맞게 호출이 되는게 확인되는데

케이블을 뽑고 화면을 끄고 시간이 좀 지나면 1분에서 점점 늘어나더니 5분에한번씩 호출됩니다.

갤럭시 S3, 옵티머스G 두개 단말로 테스트중이며 동일 증상이 나타납니다.

 

구현부분은 아래와 같습니다,

AlarmManager alarmManager = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
            Intent wifiIntent = new Intent(getApplicationContext(), ScanService.class);
            PendingIntent operation = PendingIntent.getService(getApplicationContext(), 131, wifiIntent, PendingIntent.FLAG_UPDATE_CURRENT);
            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 2000, 60 * 1000, operation);

 

ScanService는 onStartCommand가 호출될 때 마다 Bluetooth를 스캔하여 서버로 업로드하는 기능을 진행합니다.

 

도움 부탁드립니다 ( _ _ )

음무 (17,820 포인트) 님이 2016년 7월 25일 질문

1개의 답변

0 추천
제가 제대로 기억하는지 모르겠지만...

상기 사용하신 함수는 API19부터 배터리 시간 증진 목적으로 디바이스가 배터리 모드라면 정확한 시간에 동작하지 않습니다.

API19 - setExact

API21 - setAlarmClock

으로 처리 해야 할겁니다.

위 함수로 설정해야 제대로 된 시간이 1번 알람될겁니다. 그리고 이전 알람을 제거하고 새 알람을 등록하도록 해야 반복 작업이 가능할 겁니다.

 

p.s 1분 알람이면... 블투스캔 5초 + 서버 전송을 위한 Radio꺠우고 20초. 거의 30초 동안 디바이스가 깨어 있어 배터리 엄청나게 소모시킬텐데 괜찮을까요... 저는 이전 프로젝트에서 Google gms(location) ActivityRecognize을 이용해서 사용자가 걷고 있을때와 차량이동중 멈췄을 떄만 스캔하도록 했던 기억이 있네요.(디바이스가 고정되어 있거나, 탑승물 이동중인 경우에는 스캔안함.)
칠리님 (10,910 포인트) 님이 2016년 7월 27일 답변
이게 어느정도 오차범위는 상관이 없는데 .. 테스트 해 보니 S3 단말에서만 호출시간이 딜레이되는 이슈가 발생하네요. 노트2, 노트5, 옵티머스G 모두 지정한 시간에 알람이 호출되는데(노트5는 스케쥴러로 호출) S3만 단말이 유휴상태로 빠지게되면 5분에 한번으로 조정이 되어버립니다..
...