2013-07-15 2 views
5

기본적으로이 코드가 있습니다. 시간은 24 시간을 반환하고 매일 알람을 반복합니다.AlarmManager가 같은 날에 설정된 시간을 지나서 알람을 울리면 setRepeating

public setAlarm(String time, Context context){ 
    String[] strTime; 

    strTime = time.split(":"); 

    int hour, min, sec; 
    //set when to alarm 
    hour = Integer.valueOf(strTime[0]); 
    min = Integer.valueOf(strTime[1]); 
    sec = 0; 

    Calendar cal = Calendar.getInstance(); 
    cal.set(Calendar.HOUR_OF_DAY, hour); 
    cal.set(Calendar.MINUTE, min); 
    cal.set(Calendar.SECOND, sec); 
    //Create a new PendingIntent and add it to the AlarmManager 
    Intent intent = new Intent(context, AlarmReceiverActivity.class); 
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 19248, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    AlarmManager am = (AlarmManager) context.getSystemService(Activity.ALARM_SERVICE); 
    am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent); 
} 

어쨌든, 문제는 오전 9시 10 분에 알람 9am을 설정하면 알람이 울리는 것입니다. 왜? 시스템 시간이 지나면 알람이 울리지 않도록하고 싶습니다. 전의. 시스템 시간이 오전 9시 10분

답변

19

내가 지금 일하고 있어요 동안 9am에 알람을 설정합니다. 나는 알람 시간과 현재 시간의 체커를 추가했다.

public setAlarm(String time, Context context){ 
     String[] strTime; 

     strTime = time.split(":"); 

     int hour, min, sec; 
     //set when to alarm 
     hour = Integer.valueOf(strTime[0]); 
     min = Integer.valueOf(strTime[1]); 
     sec = 0; 

     long _alarm = 0; 
     Calendar now = Calendar.getInstance(); 
     Calendar alarm = Calendar.getInstance(); 
     alarm.set(Calendar.HOUR_OF_DAY, hour); 
     alarm.set(Calendar.MINUTE, min); 
     alarm.set(Calendar.SECOND, sec); 

     if(alarm.getTimeInMillis() <= now.getTimeInMillis()) 
      _alarm = alarm.getTimeInMillis() + (AlarmManager.INTERVAL_DAY+1); 
     else 
      _alarm = alarm.getTimeInMillis();    

     //Create a new PendingIntent and add it to the AlarmManager 
     Intent intent = new Intent(context, AlarmReceiverActivity.class); 
     PendingIntent pendingIntent = PendingIntent.getActivity(context, 19248, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
     AlarmManager am = (AlarmManager) context.getSystemService(Activity.ALARM_SERVICE); 
     am.setRepeating(AlarmManager.RTC_WAKEUP, _alarm, AlarmManager.INTERVAL_DAY, pendingIntent); 
    } 
+1

AlarmManager.INTERVAL_DAY +1 - 왜 +1을 추가합니까? –

+0

"알람이 지연된 경우 (예 : 시스템 알람이 아닌 유형의 경우 _ WAKEUP 알람 유형) 가능한 한 빨리 건너 뛴 반복이 전달됩니다. 이후에 원래 알람에 따라 앞으로의 알람이 전달됩니다. 시간이 흐르면 ​​표류하지 않는다.예를 들어 매시간 상위 알람 알람을 설정했지만 전화가 7:45에서 8:45까지 잠 들어있는 경우 전화기가 깨어나 자마자 알람이 전송되고 다음 알람이 보내집니다 9시. "그래서 같은 날에 알람을 설정하면 알람이 울릴 것입니다. – FeanDoe

0

사용 setInexactRepeating 대신 setRepeating

Calendar cal= Calendar.getInstance(); 
    cal.set(Calendar.HOUR_OF_DAY, 9); 
    cal.set(Calendar.MINUTE, 0); 
    cal.set(Calendar.SECOND, 0); 
    PendingIntent pi = PendingIntent.getService(context, 0, 
     new Intent(context, MyClass.class),PendingIntent.FLAG_UPDATE_CURRENT); 
    AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 
          AlarmManager.INTERVAL_DAY, pi); 
+0

? .. – useletters

+0

유 정확히 알람을 발사 할 때 [개발자 안드로이드 (http://developer.android.com/reference/android/app/AlarmManager.html) –

+0

여전히 같은 문제가 있습니다 .. '의도 의도 = 새로운 의도 (context, AlarmReceiverActivity.class); \t \t PendingIntent pendingIntent = PendingIntent.getActivity (컨텍스트, 19248, 의도, PendingIntent.FLAG_CANCEL_CURRENT); \t \t AlarmManager am = (AlarmManager) context.getSystemService (Activity.ALARM_SERVICE); \t \t am.setInexactRepeating (AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent); ' – useletters

1

나는 그것을 시도하고 해결책을 찾아 냈습니다.

당신이 여기에서 볼 수 있듯이, 때문에 잘못된 것입니다 : Calendar now = Calendar.getInstance(); Calendar alarm = Calendar.getInstance(); alarm.set(Calendar.HOUR_OF_DAY, hour);alarm.set(Calendar.MINUTE, min); alarm.set(Calendar.SECOND, sec);

"달력 지금"과 "달력 알람이"항상 상관없이 그들이 무엇 때문에 무엇을 같은 수 없습니다 똑같은 부분이 코드에서 거의 똑같은 위치에 있으므로 Calendar.getInstance()는 항상 동일합니다.

이 용액이

long _alarm; Calendar now = Calendar.getInstance(); 길이는 oldtimer = now.getTimeInMillis의 인(); setInexactRepeating하는 setRepeating의 주요 차이점은 무엇

cal.set(Calendar.HOUR_OF_DAY, Hours2int); 
    cal.set(Calendar.MINUTE, minutes2int); 
    cal.set(Calendar.SECOND, cur_cal.get(Calendar.SECOND)); 
    cal.set(Calendar.MILLISECOND, cur_cal.get(Calendar.MILLISECOND)); 
    cal.set(Calendar.DATE, cur_cal.get(Calendar.DATE)); 
    cal.set(Calendar.MONTH, cur_cal.get(Calendar.MONTH)); 

    //Calendar alarm = Calendar.getInstance(); 

    long newtimer = cal.getTimeInMillis(); 


    if(newtimer < oldtimer) { 
관련 문제