2016-04-05 17 views
1

Erinnerungen werden nicht zur richtigen Zeit ausgelöst, löst nur aus, wenn ich mein Gerät neu starte.Erinnerungen werden nicht zur richtigen Zeit ausgelöst

Ein Tag, als ich Reminder erstellte, am selben Tag bekam ich es zur richtigen Zeit, aber danach löst es nur aus, wenn ich mein Gerät neu starte (nicht auf der richtigen Zeit, die ich gewählt habe).

Wie, ich habe 5 verschiedene Erinnerungen geschaffen - eine tägliche auszulösen, Sekunde auf jedem 2 Tage auszulösen, die dritte an jedem dritten Tag auslösen, vierte wöchentliche und fünfte auslösen Monats auszulösen

Aber immer, wenn ich mein Gerät neu starten sie alle gleichzeitig auslösen (wie wenn ich mein Gerät um: 05: 00 neu starte, dann werden alle gleichzeitig ausgelöst), während ich erwartet habe, dass Eye Drop um 12:15 ausgelöst wird, Cyrip um 13 zu triggern: 20 an jedem 2. Tag und so weiter.

AlarmReceiver.java:

public void setRepeatAlarm(Context context, Calendar calendar, int ID, long RepeatTime) { 
    mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 

    // Put Reminder ID in Intent Extra 
    Intent intent = new Intent(context, AlarmReceiver.class); 
    intent.putExtra(ReminderEditActivity.EXTRA_REMINDER_ID, Integer.toString(ID)); 
    mPendingIntent = PendingIntent.getBroadcast(context, ID, intent, PendingIntent.FLAG_CANCEL_CURRENT); 

    // Calculate notification timein 
    Calendar c = Calendar.getInstance(); 
    long currentTime = c.getTimeInMillis(); 
    long diffTime = calendar.getTimeInMillis() - currentTime; 

    // Start alarm using initial notification time and repeat interval time 
    mAlarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, 
      SystemClock.elapsedRealtime() + diffTime, 
      RepeatTime , mPendingIntent); 

    // Restart alarm if device is rebooted 
    ComponentName receiver = new ComponentName(context, BootReceiver.class); 
    PackageManager pm = context.getPackageManager(); 
    pm.setComponentEnabledSetting(receiver, 
      PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 
      PackageManager.DONT_KILL_APP); 
} 
+0

Überprüfen Sie ID, von mPendingIntent = PendingIntent.getBroadcast (Kontext, ID, Absicht, PendingIntent.FLAG_CANCEL_CURRENT); Sie könnten die anderen Alarme außer Kraft setzen und nur 1 einstellen. Wenn Sie einen älteren Alarm einstellen, sollte dies den anderen nicht stören, aber die IDs, die Sie für sie einstellen, werden – Tazz

Antwort

2

Wenn Sie (wieder) die Alarme erstellen (zum Beispiel in dem Boot-Empfänger) können Sie das Datum einstellen müssen, um Wiederholungsintervalle hinzufügen, bis zu dem Zeitpunkt in der ist Zukunft.

Derzeit erstellen Sie die Alarme mit denselben Parametern neu. Es funktioniert nur bis die erste Auslösezeit erreicht ist. Danach geben Sie dem Alarmmanager bei jedem Neustart ein Datum in der Vergangenheit, sodass der Alarm sofort ausgelöst wird.

bearbeiten:

Zum Beispiel in setRepeatAlarm() Sie konnte:

// Calculate notification timein 
... 
long diffTime = ... 

// ensure the next alarm is in the future 
while(diffTime < 0) { 
    diffTime += RepeatTime; 
} 
+0

ja ich denke, Sie haben Recht .... aber darf ich wissen wie Kann ich dies kontrollieren, um meine Erinnerungen nur pünktlich auszulösen? – Sun

+0

also meinst du schließlich meine setRepeatAlarm() Methode wird aussehen wie die, die ich oben gepostet, siehe AKTUALISIERTE Abschnitt – Sun

+0

genau, und für einen nicht wiederholenden Alarm, nur nicht neu erstellen, wenn 'diffTime' negativ ist – bwt