5

Ich habe einen Fehler, wo ich nach einem Update doppelte Intents bekomme. Die Änderung, die ich vorgenommen habe, war, auf MY_PACKAGE_REPLACED zu hören und den untenstehenden Alarm erneut zu registrieren, weil ich annahm, dass Alarme beim Aktualisieren der Anwendung gelöscht wurden. Allerdings erhalte ich tatsächlich Duplikate der im folgenden Code definierten "TriggerPulse" -Rundsendung.Doppelte Absichten nach Anwendungsupdate. Erlebt der Alarm?

Der folgende Code ist der einzige Code, der den Alarm setzt. Es wird jedoch von mehreren Stellen aus aufgerufen, aber soweit ich aus Dokumenten entnehmen kann, sollte dieser Code idempotent sein (IntentRequestCodes.PULSE_SERVICE ist eine statische ganze Zahl, die auf 1 gesetzt ist). Ist es richtig von mir anzunehmen, dass dieser Code idempotent ist?

final Context applicationContext = context.getApplicationContext(); 

    Intent intent = new Intent("TriggerPulse"); 

    final int flags = 0; 
    PendingIntent pendingIntent = 
      PendingIntent.getBroadcast(applicationContext, IntentRequestCodes.PULSE_SERVICE, intent, flags); 

    AlarmManager alarmMgr = (AlarmManager)applicationContext.getSystemService(Context.ALARM_SERVICE); 
    final int triggerAtMilliseconds = 0; // run first time immediately 
    alarmMgr.setInexactRepeating(
      AlarmManager.ELAPSED_REALTIME_WAKEUP, 
      triggerAtMilliseconds, 
      AlarmManager.INTERVAL_HALF_HOUR, 
      pendingIntent 

Wenn es unter normalen Umständen idempotent ist, dass der PendingIntent bedeutet, dass aktualisiert App Erstellung ist einfach nicht als ein Spiel des PendingIntent sein, dass der alte Legacy-App schafft, was den Alarm sowieso neu terminiert werden? Wenn dies der Fall ist, kann ich das Problem einfach lösen, indem ich den Alarm auf MY_PACKAGE_REPLACED nicht neu erstelle. Allerdings deuten mehrere Ressourcen darauf hin, dass man diese bei diesem Event neu registrieren muss, was zu der Annahme führt, dass dies bei Android möglicherweise der Fall war. Wenn ja, gibt es eine Android-Version, in der dieses Verhalten geändert wurde?

Antwort

3

Versuchen Sie, den vorherigen Alarm abzubrechen, bevor Sie ihn erneut hinzufügen. Selbst wenn er zuvor hinzugefügt wurde, ist das kein Problem.

PendingIntent alarmIntent = PendingIntent.getBroadcast(CONTEXT, MY_ID, MY_INTENT, PendingIntent.FLAG_UPDATE_CURRENT); 
    AlarmManager alarmMgr = (AlarmManager) CONTEXT.getSystemService(Context.ALARM_SERVICE); 
    alarmMgr.cancel(alarmIntent);