2016-12-21 12 views
-1

Ich versuche, eine Aufgabe am Ende jeden Tages zu wiederholen (23.59), dazu möchte ich alarmmanager.setRepeating() verwenden. In meinem Test habe ich ein bisschen Code entwickelt, von dem ich dachte, dass er jede Sekunde eine Aufgabe wiederholen würde, aber es funktioniert nicht jede Sekunde, sondern wiederholt die Aufgaben jede Minute, ich bin mir nicht sicher warum und deshalb bin ich mir nicht sicher kann es für jeden Tag arbeiten lassen. Hier ist mein Code:Android: AlarmManager recuring Aufgaben einmal am Tag um Mitternacht

public class RecurringTasks extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     // add calculation logic here 
     Toast.makeText(context, "happening !!!!!!!!!!", Toast.LENGTH_LONG).show(); // For example 
    } 

    public void setRecurringTasks(Context context) 
    { 
     AlarmManager am =(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
     Intent i = new Intent(context, RecurringTasks.class); 
     PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0); 
     am.setRepeating(AlarmManager.RTC, System.currentTimeMillis(), 1000, pi); 
    } 

    public void cancelRecurringTasks(Context context) 
    { 
     Intent intent = new Intent(context, RecurringTasks.class); 
     PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0); 
     AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     alarmManager.cancel(sender); 
    } 
} 

Das ist die Linie, die Probleme verursacht, wird denke ich:

am.setRepeating(AlarmManager.RTC, System.currentTimeMillis(), 1000, pi); 

Ich dachte, das 1000 in miliseconds war? es sollte daher 1s sein? Hier

ist die Botschaft, die ich in meinem Logs erhalten:

D/DEBUG: im repeating 
E/EGL_emulation: tid 3322: eglSurfaceAttrib(1165): error 0x3009 (EGL_BAD_MATCH) 
W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x9773e540, error=EGL_BAD_MATCH 
E/Surface: getSlotFromBufferLocked: unknown buffer: 0xb2c768a0 

SOLUTION

Android wird nicht zulassen, dass Sie eine Aufgabe in weniger als einer Minute wiederholen Aus diesem Grunde Mine war nur jede Wiederholung Minute. So verwalten Sie es jeden Tag um 23.59.59 zu machen wiederhole ich den folgenden Code verwendet:

Calendar calendar = Calendar.getInstance(); 

     calendar.set(Calendar.HOUR_OF_DAY, 23); // For 1 PM or 2 PM 
     calendar.set(Calendar.MINUTE, 59); 
     calendar.set(Calendar.SECOND, 59); 

     AlarmManager am =(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
     Intent i = new Intent(context, RecurringTasks.class); 
     PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0); 
     am.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pi); 
+0

Meinten Sie um 23.59? –

+0

oups Ja, das ist, was ich meinte –

Antwort

2

Ich dachte, das 1000 war in miliseconds? es sollte daher 1s sein?

Es ist. Jedoch unter Android 5.1 und höher, you cannot schedule a repeating task that frequently. Wenn Sie es versuchen, wird es auf eine Minute aufgerundet.

+0

ok danke dafür, was soll ich in der Pause verwenden, damit es jeden Tag passiert? zum Beispiel um 23.59? –

+0

offtop: @CommonsWare, wer, wenn nicht Sie, sollten solche Fragen beantworten: D –

+0

@ Rémi: Es gibt 24 Stunden an einem Tag. Stellen Sie Ihr Intervall also auf 24 Stunden ein. [INTERVAL_DAY] (https://developer.android.com/reference/android/app/AlarmManager.html#INTERVAL_DAY) ist die Anzahl der Millisekunden in 24 Stunden. Um diese Arbeit möglicherweise zu dieser bestimmten Zeit ausführen zu lassen, verwenden Sie ein 'Calendar'-Objekt, das auf das richtige Startdatum/die richtige Uhrzeit und nicht auf 'System.currentTimeMillis()' gesetzt ist. Dann erkenne, dass du zu diesem Zeitpunkt keine Kontrolle über Android 6.0+ bekommst, wenn sich das Gerät zufällig im Doze-Modus befindet. – CommonsWare

Verwandte Themen