5

Mam błąd, w którym otrzymuję duplikaty zamiarów po aktualizacji. Zmianą, którą wprowadziłem, było rozpoczęcie słuchania MY_PACKAGE_REPLACED i ponowna rejestracja alarmu poniżej, ponieważ zakładałem, że alarmy zostały zabite, gdy aplikacja została zaktualizowana. Jednak faktycznie otrzymuję duplikaty transmisji "TriggerPulse" zdefiniowanej w poniższym kodzie.Powtórz zamiary po aktualizacji aplikacji. Czy alarmy przetrwają?

Poniższy kod jest jedynym kodem ustawiania alarmu. Jest to jednak wywoływane z wielu miejsc, ale o ile mogę zebrać z dokumentów, kod ten powinien być idempotentny (IntentRequestCodes.PULSE_SERVICE jest statyczną liczbą całkowitą ustawioną na 1). Czy to prawda, że ​​zakładam, że ten kod jest idempotentny?

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 

Jeśli jest to idempotent w normalnych warunkach, to znaczy w pendingIntent że zaktualizowanej aplikacji jest tworzenie po prostu nie jest uważany za mecz z pendingIntent że stare dziedzictwo aplikacja jest tworzenie, powodując alarm być zresetowany w każdym razie? Jeśli tak, mogę łatwo rozwiązać problem, po prostu nie odtwarzając ponownie alarmu w MY_PACKAGE_REPLACED. Jednak wiele zasobów sugeruje, że trzeba je ponownie zarejestrować na tym wydarzeniu, co może prowadzić do przekonania, że ​​może tak było w przypadku Androida. Jeśli tak, czy istnieje odcięcie wersji Androida, w której to zachowanie zostało zmienione?

Odpowiedz

3

Spróbuj anulować poprzedni alarm przed dodaniem go ponownie, więc nawet gdyby został dodany wcześniej, nie byłoby problemu.

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