2014-10-10 2 views
2

나는 매 분마다 경보를 발사하려고합니다. 그러나 어떤 이유로 그것은 일하고 싶지 않습니다. 매분마다 업데이트해야하는 위젯 시계입니다. 배터리 때문에 나는 화면을 켜고 끌 수있는 수신기를 만들었다. 그래서 내 알람은 화면이 켜져있을 때만 발동됩니다. 분은 내 시스템 시계와 동기화되어야합니다.Alarmmanager - 매분마다 화재 경보

 public static void startClockTickAlarm() { 
      AlarmManager alarmManager = (AlarmManager)_context.getSystemService(Context.ALARM_SERVICE);    
      Calendar calendar = Calendar.getInstance(); 
      calendar.setTimeInMillis(System.currentTimeMillis()); 
      calendar.add(Calendar.SECOND, 1);  
      calendar.add(Calendar.HOUR, 1); 
      alarmManager.setRepeating(AlarmManager.RTC, utcMillisNextMin(), 60000, createClockTickIntent(_context)); 
     } 

     public static final long utcMillisNextMin() { 
      Time t = new Time(); 
      t.setToNow(); 
      t.second = 0; 
      t.minute++; 
      System.out.println("Next Alarm: " + t.hour + ":" + t.minute + ":" + t.second); 
      return t.normalize(true); 
     } 

내 System.out에서 정확히 무엇을해야하는지 알려줍니다. 예를 들어 나의 위젯을 11시 30 분 15 초에 활성화하면 11시 31 분에 11시 31 분에 11시 31 분에 내 경보가 발생합니다. 내 시스템 클럭에 따르면 알람이 5-15 초 늦었습니다. 알람이 너무 늦게 울리는 시간은 항상 같지 않습니다 (5 초에서 15 초 사이).

미리 감사드립니다.

+0

기기에 어떤 API 수준이 있습니까? –

+0

또한 충돌이 발생하면 logcat 출력을 게시하십시오. –

+0

내 장치는 android 4.4.4이고 21 개를 타겟팅하고 있으며 min api는 14 개입니다. – zFr3eak

답변

3

정확한 타이밍을 사용해야하는 경우 @mighter처럼 API> = 19라고 말하면 setExact() API를 사용하십시오.

if(android.os.Build.VERSION.SDK_INT < 19) { 
    alarmManager.setRepeating(AlarmManager.RTC, utcMillisNextMin(), 60000, createClockTickIntent(_context)); 
} else { 
    alarmManager.setExact(...); 
} 
+0

완벽한, 이것은 내가 생각한 정확한 것입니다. 고맙습니다 ! – zFr3eak

+0

내 코드가'if' 블록에서 거꾸로 나타납니다. 확인해주십시오. –

+0

예, 이미 알고 있습니다. – zFr3eak

1

docs에 문 다음있다 :

참고 : API 19로, 모든 반복 알람이 부정확하다. 응용 프로그램이 정확한 배달 시간을 필요로하는 경우 위에서 설명한대로 매번 일정을 조정하여 정확한 알람 인 을 사용해야합니다. 레거시 targetSdkVersion이 API 19보다 이전 인 응용 프로그램은 이 정확히 처리 된 반복 알람을 포함하여 의 모든 알람을 계속 수신합니다.

Android 4.4.4에서 실행중인 경우 이것이 원인 일 수 있습니다.

+0

흥미 롭습니다. 그래서 내 함수 whould setWindow 같아요. 따라서 여전히 min api 14를 사용하려면 api가 19 미만이거나 그렇지 않으면 setWindow 함수를 사용하면 현재 API에 대한 확인 함수를 만들고 현재 함수를 사용해야합니까? – zFr3eak

+0

@ user2887326 setExact를 사용해야합니다. –