2016-06-23 4 views
0

확인을 잘못 발사, 그래서 알람을 설정하고 있습니다 :안드로이드 알람 관리기 elapsedTime는

long triggerTime = SystemClock.elapsedRealtime() + mynterval; 

내가 미래에 비교 triggerTime을 저장하고있어

alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerTime, pendingIntent); 

.
가끔 alarmtriggerTime보다 먼저 발사됩니다! 예를 들어

, 나는 로그에 볼 수 있습니다

scanTime: 702672466 
SystemClock.elapsedRealtime: 702672132 

무엇 델타 오류가 여기에있다 - 일초 2 ~ 3 초 이상?
그리고 왜 이런 일이 발생합니까?

+0

테스트 할 Android 버전은 무엇입니까? –

+0

만약'setExact()'를 사용한다면 - 5.1.1을 가진 장치; 이전의 장치라면 - 대신'set()'메서드를 사용합니다. –

+0

좋아, Doze 모드에 대한 내 대답을 참조하십시오. 어쨌든 델타는 두 번째 (최악의 경우) 훨씬 더 밀리 세컨드 일 것입니다. –

답변

0

이것은 Android Doze Mode으로 인해 발생합니다.

사용자가 장치를 분리하고 일정 시간 동안 화면을 끈 상태로두면 장치가 Doze 모드로 전환됩니다. Doze 모드에서 시스템은 네트워크 및 CPU 중심 서비스에 대한 응용 프로그램의 액세스를 제한하여 배터리 절약을 시도합니다.

경보는 CPU를 많이 사용하는 서비스의 경우입니다. 이미지에서 볼 수 있듯이 집중적 인 작업은 소위 유지 관리 창에서 함께 수행됩니다. (setExact()setWindow() 포함)

enter image description here

표준 알람 관리기 경보는 다음 유지 보수 창으로 연기됩니다. Doze에서 실행되는 동안 알람을 설정해야하는 경우 setAndAllowWhileIdle() 또는 setExactAndAllowWhileIdle()을 사용하십시오. setAlarmClock()으로 설정된 알람은 계속 정상적으로 발사됩니다 - 시스템은 알람이 시작되기 직전에 Doze를 종료합니다.

+0

장치가 PC에 연결되어 있고 해당 오류가 발생하는 동안 화면이 켜져 있다는 점이 흥미 롭습니다. 그리고 그 모드로 인해 알람이 방아쇠 된 시간 후에 발사 될 수도 있습니다. 하지만 제 경우에는 경보가 발포합니다. –