2017-12-28 29 views
1

내 라디오 알람 시계를 의도대로 작동시키지 못하고 soooo가 많이 발생했지만 여기에 관해서는 많은 스레드를 읽었지 만 unfortunatley는 나를 도와주지 못했습니다.setAlarmClock() doze 모드에서 너무 늦게 발생합니다.

AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);   
Intent intent = new Intent(this, AlarmReceiver.class); 
PendingIntent penInt = PendingIntent.getBroadcast(this, intentId, intent, 0); 

는 API 레벨 사이의 구별이 방법 I에 유래에 여기 및 장치에 사용되는 어떤 API 제대로 상관없이 알람을 설정할 수 없습니다 (디버깅을위한 플러스 일부 로그 메시지) 내 calcNextAlarm() 함수 안에 넣어 :

// problems in doze mode api 23+ 
if (Build.VERSION.SDK_INT >= 23) { 
    if (testMode) Log.d("Ben", "setAlarmClock() - API 23+"); 
    am.setAlarmClock(new AlarmManager.AlarmClockInfo(alarmTimeInMillis, penInt), penInt); 
} 

else if (Build.VERSION.SDK_INT >= 19) { 
// Wakes up the device in Idle Mode 
    if (testMode) Log.d("Ben", "setExact() - API >= 19 && API < 23"); 
    am.setExact(AlarmManager.RTC_WAKEUP, alarmTimeInMillis, penInt); 
} 
// Old APIs 
else { 
    if (testMode) Log.d("Ben", "set() - API < 19"); 
    am.set(AlarmManager.RTC_WAKEUP, alarmTimeInMillis, penInt); 
} 

나는 그것을 볼 수 Log.d 메시지에 따르면, 내 안드로이드 7.1 장치에 첫 번째 방법 setAlarmClock()는 수신기에 알람을 설정하기 위해 실행되고있다.

나는 실패 시험 3 주 후에 정말 필사적 받고 코딩하고 - 도즈 모드 교육 페이지에 따르면, 이런 일이 안됩니다 - 오늘 사분 너무 늦게 다시 내려서 내 알람 : 설정

경보를 setAlarmClock()이 계속 정상적으로 발동 - 시스템이 Doze를 종료 한 후 해당 알람이 작동합니다.

알람을 "지금 +5 또는 6 분"으로 설정하면 알람이 20 초에서 1:40 분 늦어집니다. 아무도 정말 내게 시간에 완벽하게 경보를 울리는 방법을 조언 해 주실 수 있습니까? 사용

답변

1

시도 :

setExactAndAllowWhileIdle() 

이 보장하는 시간에 알람 화재가. 내 자신의 응용 프로그램에서 그것을 테스트하고 그것은 신뢰할 수 있습니다.

API를 23 미만으로 타겟팅하는 경우이 값을 장치에 설치된 현재 API를 확인하는 if 절 안에 보관하십시오. 내가 정확하게)

2

연결되는 배터리없이 졸다 모드에서 테스트 한

1) : 귀하의 코멘트에 대답

모든 권리를 setExact

을 계속 사용 나머지 만 API 레벨 23 이상이 사용 불행히도 유휴 유형 경보 동안 9 분 동안 한 건의 경보가 있습니다. 여기에는 두 가지 대안이 있습니다.

첫 번째 알람을 시작하려면 먼저 setExactAndAllowWhileIdle을 사용하십시오.

a)에 잠 들어 잠에 대한 setAlarmClock 방법

나에게) 사용해야합니다, 당신은 당신의 다시 알림 시간으로 설정 최소 지연 시간이 예정 JobScheduler 작업을 할 수 있습니다. 이렇게하면 스누즈 간격의 간격으로 작업 일정을 잡을 수 있습니다. 그러나 이것만으로도 작업이 일정 간격 후에 일정하게 잡히게되므로 최소 대기 시간 직후에 작업을 예약 할 수 있도록 다시 정의 기한을 0으로 설정해야합니다. 또한 네트워크 요구 사항을 none으로 설정하고 유휴 모드를 기본값 또는 false로 유지하십시오. 이것은 또한 내 경험에 따라 정확한 방법으로 알람을 처리하는 것처럼 신뢰할 수 있으며 개인적으로이 방법을 사용합니다.

+0

또한 setAlarmClock 메소드와 같은 잠재적 인 알림을 사용자에게 표시하지 않습니다. 이제는 절대 정확한 것은 아니지만 내 경험에 따르면 5 ~ 10 초 정도는 비교적 정확합니다.마지막 절망적 인 대안은 사용자가 원할 때 우선 순위 FCM 메시지를 장치에 적용하는 것일 수 있지만 네트워크 연결에 따라 다릅니다. – Kushan

+0

나는 전에 그걸 시험해 보았 겠지만, 필사적이다. 나는 한번 시도해 보겠다. :) 1 : 배터리가 정확하고 충전되지 않았습니까? (모든 방법이 전원 케이블과 도즈 모드에서 완벽하게 정확하기 때문에) 2 : doze training 페이지에 따라 : '참고 : setAndAllowWhileIdle()도 setExactAndAllowWhileIdle()도 두 번 이상 경고를 낼 수 없습니다 9 분, 앱당. 5 분 동안 "일시 중지"하려면 - ** setExactAndAllowWhileIdle() ** 대신 snooze에 대해 보통 ** setAlarmClock() **을 사용해야합니까? 3 : 대상 API 27 및 최소 SDK는 16입니다. – Ben

+0

그래, 시도해보십시오. 내가 지정한 두 개와 이미 사용하고있는 것이 어쨌든 닥스 모드를 처리하는 유일한 도구입니다. 유휴 상태가 나를 위해 가장 잘 작동하는 동안 허용하십시오. 몇 가지 기기에서 테스트했습니다. 항상 나를 위해 잘 작동 – Kushan