2016-01-06 5 views
10

Ich habe eine BroadcastReceiver, die Alarme bei Ereignissen wie Booten und Zeitänderung neu plant. Wenn die Zeit jedoch nach der Auslösezeit des Alarms verstrichen ist (z. B. wenn der Benutzer die Uhrzeit manuell von den Einstellungen ändert), löst der Alarm sofort aus, bevor ich einen Tag hinzufügen kann, um den Alarm neu zu planen. Wie kann ich das vermeiden?AlarmManager feuert Alarme in der Vergangenheit, unmittelbar bevor BroadcastReceiver es neu planen kann

Ich verwende derzeit das Set und Methoden des Calendar hinzufügen, um die Alarme zu planen.

 for (int dayOfWeek = Calendar.SUNDAY; dayOfWeek <= Calendar.SATURDAY; dayOfWeek++) { 
      if (alarm.getRepeatingDay(dayOfWeek - 1) && dayOfWeek >= nowDay && 
        !(dayOfWeek == nowDay && alarm.timeHour < nowHour) && 
        !(dayOfWeek == nowDay && alarm.timeHour == nowHour && alarm.timeMinute <= nowMinute)) { 

       calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek); 
       alarmSet = true; 
       break; 
      } 
     } 

     if (!alarmSet) { 
      for (int dayOfWeek = Calendar.SUNDAY; dayOfWeek <= Calendar.SATURDAY; dayOfWeek++) { 
       if (alarm.getRepeatingDay(dayOfWeek - 1) && dayOfWeek <= nowDay) { 
        calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek); 
        calendar.add(Calendar.WEEK_OF_YEAR, 1); 
        break; 
       } 
      } 
     } 

Es ist auch in der Dokumentation angegeben:

Wenn die angegebene Trigger-Zeit in der Vergangenheit ist, wird der Alarm sofort ausgelöst werden.

Wie kann dieses Verhalten geändert werden?

+0

Ich würde vorschlagen, Sie Jobscheduler zu verwenden, wie Sie loswerden der gestellten Aufgabe zu bekommen. – UMESH0492

Antwort

4

Dies ist beabsichtigt. Siehe z.B. Set a Repeating Alarm

Eine Auslösezeit. Wenn die von Ihnen angegebene Auslösezeit in der Vergangenheit liegt, wird der Alarm sofort ausgelöst.

oder die gleiche here

Wenn die angegebene Trigger-Zeit in der Vergangenheit ist, wird der Alarm sofort ausgelöst werden.

Um dies zu vermeiden Sie haben entweder manuell Alarme überprüfen, bevor sich das Hinzufügen,

if(alarmTimeStamp < System.currentTimeMillis()) { 
    // if is repeating schedule in __interval__ 
    // else ignore 
} 

oder sie in Ihrem Empfänger ignorieren, wenn das Datum in der Vergangenheit.

+0

Ich weiß, ich habe die Dokumente gelesen. Aber ich möchte ausdrücklich einen Weg finden, dies zu verhindern. – Piyush

+0

@PiyushShrivastava hat gerade die Antwort aktualisiert. Sie müssen Datumsprüfungen selbst durchführen, da es keine allgemeine Lösung gibt. –

+0

Ich habe die Datumsprüfung implementiert. Aber das Problem ist, dass der Alarmmanager den Alarm auslöst, bevor mein Empfänger überhaupt angerufen wird. Wie bekomme ich vorher den Empfänger angerufen? – Piyush

0

Wie David sagte, überprüfen Sie das Alarmdatum/die Alarmzeit, bevor Sie es verwenden; Wenn es in der Vergangenheit ist, dann fügen Sie eine Sekunde oder Minute oder was auch immer hinzu, bevor Sie es der AlarmManager zuführen.

Wenn ein Benutzer das Datum/die Uhrzeit eingibt, überprüfen Sie die Eingabe auf die gleiche Weise.

+0

Die Vorabprüfung der Eingabe ist nur möglich, wenn der Benutzer die Alarmzeit ändert. Nicht wenn die Uhrzeit von den Einstellungen abweicht. – Piyush

0

Wie wäre es mit der Erstellung eines BroadcastReceiver zum Anhören von Zeit ändern.

In Manifest Datei,

<receiver android:name=".MyReceiver"> 
      <intent-filter > 
       <action android:name="android.intent.action.TIME_SET"/> 
      </intent-filter> 
</receiver> 

und Ihre BroadcastReceiver Datei

public class MyReceiver extends BroadcastReceiver{ 

    @Override 
    public void onReceive(final Context context, Intent intent) { 
     Log.d("MyReceiver", "Time Changed"); 
     // The times have changed; so have their signs. 
     updateYourAlarm(); 
    } 
} 
+0

Ich habe bereits TIME_SET- und DATE_CHANGED-Aktionen im Manifest hinzugefügt. Das Problem besteht immer noch. – Piyush

+0

BroadcastReceiver onReceive genannt mehrfache Zeiten, wenn Sie das Datum oder die Uhrzeit manuell ändern, in Manifest verwende ich diese beiden als Absicht Filter TIME_SET und DATE_CHANGED –

Verwandte Themen