2011-01-15 10 views
3

Dies funktioniert gut:Android Wiederholung Alarm funktioniert nicht

Intent intent = new Intent(HelloAndroid2.this, AlarmReceiver.class); 

    PendingIntent pendingIntent = PendingIntent.getBroadcast(HelloAndroid2.this, 0, 
    intent, PendingIntent.FLAG_ONE_SHOT); 

    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (12 * 1000), pendingIntent); 

Dies funktioniert nicht. Ich höre den Alarm nur mal.

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (12 * 1000), 3 * 1000, pendingIntent); 

Ich habe auch schon versucht, diese, kein Glück:

Calendar calendar = Calendar.getInstance(); 
    calendar.setTimeInMillis(System.currentTimeMillis()); 
    calendar.add(Calendar.SECOND, 5); 

    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 7000, pendingIntent); 

Was ist das Problem?

Antwort

3

Vom PendingIntent doc für FLAG_ONE_SHOT:

diese PendingIntent kann nur einmal verwendet werden. Wenn gesetzt, nachdem send() aufgerufen wird, wird es automatisch für Sie storniert und alle zukünftigen Versuch, über es senden wird fehlschlagen.

So nach dem PendingIntent das erste Mal gebrannt wird, wird es abgebrochen und der nächste Versuch, es über den Alarmmanager fehl senden wird

Versuchen FLAG_UPDATE_CURRENT mit

+0

Das war sehr einfach. Vielen Dank. – erdomester

0

an Ihren Code-Beispielen Suche in Bestellung:

In Ihrer ersten Probe verwenden Sie AlarmManager.set - dies ist ausschließlich für einmalige Alarme, also ja, es wird nur einmal ausgelöst. Wenn Sie AlarmManager.set verwenden möchten, dann sollte der zuletzt ausgelöste Code einen neuen Alarm setzen (der auch einen neuen PendingIntent verwenden sollte).

In Ihrem zweiten Beispiel verwenden Sie einen sich wiederholenden Alarm. Sie nicht müssen ein neues PendingIntent jedes Mal, wenn dieses Feuer als das OS kümmert sich um den sich wiederholenden Aspekt des Alarms erstellt.

Es gibt keinen Grund, warum sich Ihr Alarm nicht alle 3 Sekunden wiederholen sollte. Daher würde ich mir die BroadcastReceiver-Implementierung ansehen, die Sie geschrieben haben, um den Alarm zu behandeln.

Überprüfen Sie, ob Sie es richtig implementiert haben. Kommentieren Sie den gesamten Code in der onReceive() -Methode, und schreiben Sie stattdessen eine Protokollnachricht. Sobald Ihre Protokollmeldung bei jedem Alarm im Logcat erscheint, fügen Sie den Code wieder hinzu (Protokollnachricht beibehalten) und eine weitere Protokollmeldung am Ende der Methode. Dadurch können Sie sehen, wie lange die Methode ausgeführt wird - Sie möchten, dass sie beendet wird, bevor der Alarm erneut ausgelöst wird, um unerwartete Nebenwirkungen zu vermeiden.

Wenn Sie einen wiederholten Alarm wünschen, ist android.os.Handler ein viel effizienterer Ansatz, obwohl Alarme, die über den AlarmManager eingestellt werden, sehr genau ausgelöst werden.