2016-09-05 4 views
1

Ich möchte eine BroadcastReceiver nach bestimmten Zeitintervallen aufrufen. BroadcastReceiver ruft an, aber es ruft nicht genau nach 10 Sekunden an, manchmal ruft es 20 Sek. Manchmal mehr als 20 Sekunden auf. Ich möchte BroadcastReceiver genau nach 10 Sekunden anrufenAlarmManager BroadcastReceiver nach bestimmten Zeitintervall nicht aufrufen

Dies ist der Code von MainActivity

Intent myIntent = new Intent(MainActivity.this, SampleReceiver.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, myIntent,0); 
AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); 
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, wakeupTime,1000 * 10, pendingIntent); 

Dies ist Code von broadcastreceiver

public class SampleReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.e("Brodcast","receiver"); 
    } 
} 

Das ist meine Protokolldatei

09-05 14:48:21.444 18222-18222/com.loconav.partners.tracker E/Brodcast: receiver 
09-05 14:49:21.509 18222-18222/com.loconav.partners.tracker E/Brodcast: receiver 
09-05 14:50:31.578 18222-18222/com.loconav.partners.tracker E/Brodcast: receiver 
09-05 14:51:21.618 18222-18222/com.loconav.partners.tracker E/Brodcast: receiver 
+0

http://stackoverflow.com/questions/39036001/android-how-to-run-background-service-periodically/39036118#39036118 diese –

+0

helfen werde ich wiederholen möchten nach bestimmten Sekunden. Es ruft an, aber nicht nach bestimmten Zeitintervallen. –

+0

@SumitMarwha Das liegt daran, dass wiederholte Alarme auf API-Ebene 19+ ungenau sind. Siehe meine Antwort unten. – earthw0rmjim

Antwort

0

Verwenden Sie zuerst ELAPSED_REALTIME_WAKEUP Typ, weil Sie kein Feuer benötigen Alarm zu einer bestimmten Tageszeit. Wenn Sie rtc time verwenden, kann es vom System aktualisiert werden - wenn es mit dem Zeitserver synchronisiert wird und Ihr Alarm überhaupt nicht ausgelöst werden kann.

Zweitens, verwenden Sie keine BroadcastReceivers, die als Unterklassen von Activity definiert sind - sie sollten in AndroidManifest.xml eingerichtet werden, denn wenn Ihre Aktivität zerstört wird, werden Sie niemals Ihre Absicht erhalten.

+0

Ich bekomme Ihren zweiten Punkt nicht –

+0

Nun, wenn Sie alle 10 Sekunden etwas tun müssen, während Aktivität läuft - verwenden Sie TimerTask oder Thread oder etwas. BroadcastReceivers sollten in Manifest deklariert und ohne Ausführung der Instanz der Aktivität verwendet werden. –

2

Vom documentation von AlarmManager:

Hinweis: mit API Ab 19 (KITKAT) Alarm Lieferung ist ungenau: Die OS Alarme, um verschieben Wakeups und Batterieverbrauch zu minimieren. Dort sind neue APIs zur Unterstützung von Anwendungen, die strenge Lieferung benötigen Garantien; siehe setWindow(int, long, long, PendingIntent) und setExact(int, long, PendingIntent). Anwendungen, deren targetSdkVersion älter ist als API 19, werden weiterhin das vorherige Verhalten sehen, in dem alle Alarme genau geliefert werden, wenn angefordert wird.

Genaues Wiederholen ist derzeit mit einem einzigen Alarmsatz auf API-Ebene 19+ nicht möglich.

Wenn Sie möchten, dass Ihr Wiederholungsalarm genau dann ausgelöst wird, wenn Sie möchten, sollten Sie setExact() (oder setExactAndAllowWhileIdle() entsprechend Ihren Anforderungen) verwenden und ihn jedes Mal neu planen, wenn er ausgelöst wird.

0

Ich denke, Sie müssen eindeutige Anfrage Code zur Verfügung stellen Broadcast-Methode zu erhalten.

Intent myIntent = new Intent(MainActivity.this, SampleReceiver.class); 
       PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, uniqueRequestCode, myIntent,0); 
       AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); 
       alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, wakeupTime,1000 * 10, pendingIntent); 

uniqueRequestCode könnte die System.currentTimeInMilliSecond sein

0

Ich weiß nicht, was in wakeupTime. Der Code funktioniert für mich als

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),1000*10,pendingIntent); 
Verwandte Themen