72 Stimmen

Woher weiß ich, dass meine Android-Anwendung aktualisiert wurde, um einen Alarm zurückzusetzen?

Ich habe festgestellt, dass ein Alarm deaktiviert wird, wenn die Anwendung, die diesen Alarm auslöst, aktualisiert wurde. Ist das wahr?

Bis jetzt habe ich die SharedPreferences mit einer FIRST_RUN Taste, um zu wissen, ob es sich um den ersten Lauf meiner Anwendung handelt. Wenn ich diesen Schlüssel nicht finde, aktiviere ich den Alarm und setze FIRST_RUN auf false, sonst tue ich nichts.

Aber ich habe auch festgestellt, dass diese Einstellungen zwischen App-Upgrades erhalten bleiben!

Nach einem Upgrade wird also die FIRST_RUN ist bereits falsch, also tue ich nichts, während mein Alarm aktiviert werden muss.

Wie soll man in einem solchen Fall vorgehen?

Vielen Dank im Voraus

93voto

tbruyelle Punkte 12665

Lösung von Daniel Lew :

Ich benötige einen Empfänger mit den folgenden Zeilen im Manifest:

<receiver android:name=".OnUpgradeReceiver">
  <intent-filter>
    <action android:name="android.intent.action.PACKAGE_REPLACED" />
    <data android:scheme="package" android:path="your.app.package" />
  </intent-filter>
</receiver>

android:path wird verwendet, um zu verhindern, dass OnUpgradeReceiver bei jeder Aktualisierung einer beliebigen Anwendung ausgelöst werden.

7 Stimmen

Der Pfadteil wird nur verwendet, wenn sich das Schema auf einen hierarchischen URI bezieht. Im Fall von "package", das sich nicht auf einen hierarchischen URI bezieht, können Sie keine Pfadzeichenfolge übergeben. Allerdings wird <data Android:scheme="package"/> Ihr Anwendungspaket an den URI anhängen ("package:your.app.package"), so dass Sie ohnehin keinen Pfad übergeben müssen.

1 Stimmen

Benötigt die Anwendung spezielle Berechtigungen, um auf PACKAGE_REPLACED zu hören?

1 Stimmen

Nein, die App benötigt keine spezielle Erlaubnis

63voto

Dan Lew Punkte 83507

Ich habe das selbst noch nie ausprobiert, aber wie wäre es, eine BroadcastReceiver die den ACTION_PACKAGE_REPLACED Absicht?

Ich habe schon einmal darüber nachgedacht, dies zu versuchen, aber ich bin mir nicht sicher, ob es dabei ein Henne-Ei-Problem gibt oder nicht (z. B. wird der Intent gesendet, bevor die neue, aktualisierte Anwendung ihn empfangen kann). Einen Versuch ist es aber wert.

1 Stimmen

Ja, es funktioniert! Danke Daniel, eigentlich wird die Absicht gleich nach dem Upgrade gesendet, so dass mein Empfänger sie auffangen kann. Ich frage mich jetzt nur, ob mein Empfänger bei jedem Upgrade einer Anwendung ausgelöst wird?

1 Stimmen

Es wird bei jedem Upgrade ausgelöst, aber in der Dokumentation steht, dass man sich die Daten des Intents ansehen kann und dort der Name des Pakets steht. Daher können Sie Intent-Filter verwenden, um alle Paketerneuerungen herauszufiltern, die nicht Ihre eigenen sind.

1 Stimmen

Benötigt die Anwendung spezielle Berechtigungen, um auf PACKAGE_REPLACED zu hören?

23voto

Sami Eltamawy Punkte 9670

Hören Sie sich einfach die android.intent.action.MY_PACKAGE_REPLACED ... Diese INTENT benachrichtigt Sie, wenn eine neue Version Ihrer Anwendung über eine bestehende Version installiert wurde

Hinweis: Diese Funktion ist ab API 12 verfügbar.

1 Stimmen

Dies sollte die einzige empfohlene Lösung sein. Es gibt keine Möglichkeit, Android.intent.action.PACKAGE_REPLACED nur für die lokale App vor API 19 richtig zu filtern, und wenn dieser Intent den Start der App bei jeder App-Installation auslöst, ist das äußerst ineffizient.

21voto

armansimonyan13 Punkte 846

Für Android API Level 12 und höher müssen Sie BroadcastReceiver mit der Aktion AKTION_MEIN_PAKET_ERSETZT

<receiver android:name=".MyBroadcastReceiver">
  <intent-filter>
    <action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
  </intent-filter>
</receiver>

0 Stimmen

Dies ist die richtige Antwort, wenn Sie moderne Android-Betriebssysteme unterstützen. Für die meisten Anwendungen (Gingerbread hat derzeit einen Marktanteil von 1 %) vereinfacht die Verwendung von MY_PACKAGE_REPLACED den Code des Rundfunkempfängers.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X