2013-07-15 12 views
5

Also im Grunde habe ich diesen Code, Zeit gibt 24 Stunden Zeit und wiederholt den Alarm täglich.AlarmManager feuern Alarm nach der Zeit, die es am selben Tag festgelegt wurde, 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); 
} 

Wie auch immer, das Problem ist, wenn ich den Wecker 9 Uhr morgens stelle, während die Zeit 9:10 Uhr ist, wird der Wecker gehen. Warum? Ich möchte es nicht alarmieren, wenn es über die Systemzeit hinaus eingestellt ist. Ex. stellen Sie den Alarm um 9 Uhr morgens, während die Systemzeit 09.10

Antwort

19

ist habe ich es jetzt arbeiten. Ich fügte einen Checker der Alarmzeit und der gegenwärtigen Zeit hinzu.

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 - Warum fügen Sie +1 hinzu? –

+0

Weil "Wenn ein Alarm verzögert wird (durch Systemruhezustand, z. B. für Alarmtypen ohne _WAKEUP), wird eine übersprungene Wiederholung so schnell wie möglich geliefert. Danach werden zukünftige Alarme gemäß dem ursprünglichen Zeitplan zugestellt nicht mit der Zeit driften.Wenn Sie z. B. für jede Stunde einen wiederkehrenden Alarm eingestellt haben, aber das Telefon von 7:45 bis 8:45 Uhr geschlafen hat, wird ein Alarm gesendet, sobald das Telefon erwacht und der nächste Alarm gesendet wird 9:00 Uhr. "Der Alarm wird also ausgelöst, wenn Sie ihn am selben Tag einstellen – FeanDoe

0

Verwenden setInexactRepeating statt 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

Was der Hauptunterschied von setRepeating ist zu setInexactRepeating? .. – useletters

+0

Wenn u wollen Alarm ausgelöst genau [Entwickler Android] (http://developer.android.com/reference/android/app/AlarmManager.html) –

+0

Immer noch das gleiche Problem .. 'Intent Intent = neue Absicht (Kontext, AlarmReceiverActivity.class); \t \t PendingIntent pendingIntent = PendingIntent.getActivity (Kontext, 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

Die angenommene Antwort ist falsch, wie ich es versuchte und dann die Lösung herausgefunden.

Es ist falsch, weil, wie Sie hier sehen können: 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);

„Kalender jetzt“ und „Kalender-Alarm“ wird immer das gleiche sein, egal was, weil sie tun Das selbe Ding fast an genau der gleichen Stelle im Code, so dass die Calendar.getInstance() immer dieselbe sein wird.

Die Lösung ist der Lauf

long _alarm; Calendar now = Calendar.getInstance(); lange oldtimer = 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) {