2013-07-15 96 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分设置闹钟9点时,闹钟将熄灭。为什么?如果它超过系统时间,我希望它不会报警。防爆。设置报警上午9点,而系统时间为上午9:10

回答

19

我现在的工作。我添加了闹钟时间和当前时间的检查器。

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:00。 “所以,如果你在同一天设置警报,警报就会启动 – 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

什么setRepeating的主要区别setInexactRepeating?.. – useletters

+0

当u要准确火灾报警[开发的Android(http://developer.android.com/reference/android/app/AlarmManager.html) –

+0

仍然存在相同的问题。 'Intent intent = new Intent(context,AlarmReceiverActivity.class); \t \t PendingIntent pendingIntent = PendingIntent.getActivity(context,19248,intent,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(); 长=老爷now.getTimeInMillis();

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) { 
相关问题