2016-08-15 4 views
0

Dies ist das erste Mal, dass ich AlarmReciever verwenden. Dies ist ein Teil des Dienstes:Alarmmanager Brände nach unterschiedlichen Zeiten auf verschiedenen API

//Service 
    this.context=this; 
    Intent alarm = new Intent(this.context,AlarmReceiver.class); 
    boolean alarmRunning =(PendingIntent.getBroadcast(this.context,0, alarm,PendingIntent.FLAG_NO_CREATE) != null); 
    if(alarmRunning == false){ 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(this.context,0,alarm,0); 
     AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
     alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(),15000,pendingIntent); 
    } 

Ich dachte, dass 15000 in alarmManager.setRepeating bedeutet 15 Sekunden. Auf meinem S4 Mini mit API 19 ist es richtig. Aber mit meiner S7 mit API 23 wird der Alarm jede Minute ausgelöst. Weiß jemand das Problem dafür?

Hier ist mein Log:

08-15 10:54:15.949 11495-11522/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 10:55:15.619 11495-12452/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 10:56:15.619 11495-13407/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 10:57:15.629 11495-14288/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 10:58:15.629 11495-15193/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 11:00:00.039 11495-16907/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 11:00:15.599 11495-17149/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 11:01:15.619 11495-18085/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 11:02:15.659 11495-19040/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 11:03:58.049 11495-19601/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 11:06:11.419 11495-19878/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 11:11:11.349 11495-24547/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 11:16:11.449 11495-29123/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 

Wie ich sehe, es feuert nun alle paar Minuten.

Antwort

0

Da der Alarm Manager das Gerät aktiviert, das die Batterie entlädt, bietet Android einige neue Möglichkeiten, die ausstehende Absicht auszulösen. Bei Geräten mit einem API von mehr als oder gleich 19 werden die Alarme zusammen ausgelöst, wenn zwei oder mehr Alarme eine ähnliche Zeit haben, um die ausstehende Absicht zu starten, sodass das Gerät nicht jedes Mal für jeden Alarm aufgeweckt werden muss. So ist die neue Modifikation, die Sie tun müssen, ist, diesen Code zu platzieren:

AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

Nach dieser Codezeile, legen Sie diesen:

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) { 
     alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(),15000,pendingIntent); 

} else { 
     alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(),15000,pendingIntent); 
} 

Wenn hier Android API größer als KITKAT, setExact Methode verwendet, und wenn nicht, wird der Alarm normal wie Sie eingestellt. Hoffe, das funktioniert, alles Gute.

+0

Vielen Dank. Also sollte ich Ihren Code oben anstelle von alarmManager.setRepeating ... verwenden? – Koss

+0

Ja, kopieren Sie genau diesen Code, warten Sie, ich werde es ändern, so dass Sie nur kopieren können und nicht zu Ihrem Code ändern müssen. –

+0

Mein Vergnügen, und bitte akzeptieren Sie die Antwort und stimmen Sie ab, wenn es funktioniert. :)) –

0

Von der neuen Dokumentation:

Hinweis: wie der API 19, alle Wiederholung Alarme sind ungenau. Wenn Ihre Anwendung genaue Lieferzeiten benötigt, muss sie einmalige exakte Alarme verwenden, die wie oben beschrieben jedes Mal neu geplant werden. Ältere Anwendungen, deren targetSdkVersion älter als API 19 ist, werden weiterhin alle ihre Alarme, einschließlich der Wiederholung von Alarmen, als genau behandelt behandeln.

Also, wie können Sie das gleiche Verhalten erhalten? Sie können setExact verwenden und den AlarmManager über PendingIntent zurücksetzen

Verwandte Themen