2017-04-07 2 views
0

Ich habe viele Artikel gelesen, aber nicht scheint für mich zu arbeiten!Android Alarm Manager, um eine Aufgabe zu einer bestimmten Zeit

Ich muss eine wiederkehrende Aufgabe mit AlarmManager für jeden Tag um 7:15 Uhr planen. Die folgende Methode wird in einer Aktivität festgelegt und ein Broadcast-Empfänger dafür registriert!

private void setTask(Context context) { 

    Calendar updateTime = Calendar.getInstance(); 
    updateTime.setTimeZone(TimeZone.getTimeZone("GMT")); 
    updateTime.set(Calendar.HOUR_OF_DAY, 7); 
    updateTime.set(Calendar.MINUTE, 15); 

    Intent intent = new Intent(context, NotifyUpdate.class); 
    PendingIntent fireAlarm = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    AlarmManager alarms = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
    alarms.setRepeating(alarms.RTC_WAKEUP, updateTime.getTimeInMillis(), alarms.INTERVAL_DAY, fireAlarm); 
} 

Das Problem ist, wenn ich die Anwendung des Verfahren sofort ausgeführt, unabhängig von der eingestellten Zeit ausgeführt wird, aber nicht auf (7,15) ausführen.

Irgendeine Idee?

+0

Ist die Klasse 'NotifyUpdate' ein' Service' oder ein 'BroadcastReceiver'? – devnull69

+0

Danke für die Antwort! Es ist ein BroadcastReceiver –

+0

Der Alarm scheint in Ordnung zu sein. Die Abweichung kann woanders liegen ... Sind Sie sicher, dass Sie die Methode nicht manuell vom BroadcastReceiver aus aufrufen? Außerdem kann der Android6 + Doze-Modus den AlarmManager stören, wenn Sie Ihre App nicht zur Optimierungsausnahmeliste hinzugefügt haben. – devnull69

Antwort

0

Versuchen Sie dies, bevor Alarm ausgelöst

Calendar now = Calendar.getInstance(); 
if (updateTime.before(now)) { 
      updateTime.add(Calendar.DAY_OF_MONTH, 1); // if its in the past increment 
} 

alarms.setRepeating(alarms.RTC_WAKEUP, updateTime.getTimeInMillis(), alarms.INTERVAL_DAY, fireAlarm); 

Sie sagten, dass Sie sofort haben Auslösung nicht in Abhängigkeit von der Zeit. Es passiert, weil updateTime-Objekt auf die Zeit in der Vergangenheit verweist, so dass das Ziel darin besteht, einen Alarm auf 7:15 in der Zukunft zu setzen. Dies wird helfen, ein sofortiges Auslösen zu vermeiden.

+0

Bitte fügen Sie eine Erklärung zu Ihrer Antwort hinzu. – jmattheis

+0

Bitte fügen Sie dies Ihrer Antwort hinzu. – jmattheis

+0

In meinem Code habe ich die Kalenderinstanz genommen und auf der updateTime gespeichert! Soll ich eine weitere Instanz bekommen und sie auf dem Jetzt speichern? !! –

Verwandte Themen