2016-10-10 2 views
0

Ich versuche Code zu schreiben, der eine Aufgabe zu bestimmten Stunden jeden Tag ausführt.Die Verwendung eines Dienstes mit AlarmManager und Kalender zur Ausführung der Aufgabe zu bestimmten Zeiten funktioniert nicht

Ich habe eine hours Array, die Ganzzahlen enthält und ich durchlaufen es um einen wiederholten Alarm von dieser Stunde und mit einem Intervall von einem Tag einzustellen.

Wenn ich die Aufgabe, nur den Dienst erstellen und ausführen alle 10 Sekunden oder so es die AlarmReciever liefen nicht aber dieser Code funktioniert nicht nach der Zugabe des Calendar API, was mache ich falsch?

AlarmManager alarmManager; 
    Calendar current = new GregorianCalendar(); 
    Calendar calendar = new GregorianCalendar(); 
    int[] hours = new int[] {14, 18, 21, 22}; 

    public int onStartCommand(Intent intent, int flags, int startId) { 
     current.setTimeInMillis(System.currentTimeMillis()); 

     alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
     Intent intent1 = new Intent(this, AlarmReceiver.class); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent1, 0); 
     for (int hour : hours) { 
      calendar.add(Calendar.DAY_OF_YEAR, current.get(Calendar.DAY_OF_YEAR)); 
      calendar.set(Calendar.HOUR_OF_DAY, hour); 
      calendar.set(Calendar.MINUTE, 0); 
      calendar.set(Calendar.SECOND, 0); 
      calendar.set(Calendar.MILLISECOND, 0); 
      calendar.set(Calendar.DATE, current.get(Calendar.DATE)); 
      calendar.set(Calendar.MONTH, current.get(Calendar.MONTH)); 
      alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent); 
     } 
     return START_STICKY; 
    } 

EDIT: Ich habe versucht, calendar.getTimeInMillis() für jede Schleife Ausdrucken und hier ist die Ausgabe

I/System.out: 2391249600000 
I/System.out: 2643724800000 
I/System.out: 2769962400000 
I/System.out: 2833038000000 

Können sagen, ich nehme die beiden ersten Zahlen: 2643724800000-2391249600000 = 252475200000. 252475200000/1000 = 252.475.200. 252475200/60 = 4207920. Ich bin mir ziemlich sicher 4207920 Minuten ist mehr als eine Stunde. Warum ist das so?

+0

Sie wissen, dass Sie den addierenden Tag des Jahres mit Datum überschreiben, wenn Sie calendar.set aufrufen (Calendar.DATE ...), richtig? – MikeL

+0

@MikeL Ich verstehe nicht wirklich, wie das funktioniert. Ich habe es genauso gemacht wie hier: http://stackoverflow.com/questions/3052149/using-alarmmanager-to-start-a-service-at-specific-time –

+0

Eigentlich lag ich falsch in Bezug auf Override, Sie tun etwas Schlimmer noch, Sie addieren jedes Mal den aktuellen Tag des Jahres (zum Beispiel jetzt ist es 284), so dass Sie den Kalender auf das nächste Jahr einstellen und dann überschreiben Sie das Datum auf das aktuelle Datum, aber das Jahr ist immer noch das nächste. Versuchen Sie, den ".add" -Teil zu entfernen und testen Sie ihn. – MikeL

Antwort

0

Okay, ich habe herausgefunden, wie ich mein Problem beheben kann. Vor allem dank @MikeL für den Vorschlag, calendar.add(Calendar.DAY_OF_YEAR, current.get(Calendar.DAY_OF_YEAR)); zu entfernen, weil das einige Sachen repariert hat, aber selbst danach hat es nicht funktioniert.

das Problem zu beheben ich PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent1, 0);-PendingIntent pendingIntent = PendingIntent.getBroadcast(this, hour, intent1, 0); geändert

Im Grunde die 0-hour so zu ändern, dass jede anhängige Absicht unterscheidet.

Verwandte Themen