Come sapere la mia applicazione per Android è stato aggiornato in modo da resettare un allarme?

Ho notato che un allarme è disabilitato quando l’applicazione che imposta l’allarme è stato aggiornato. È vero ?

Fino ad ora, ho usato il SharedPreferences con un FIRST_RUN chiave per sapere se è la prima esecuzione dell’applicazione. Se non riesco a trovare questa chiave, attivare l’allarme e impostare FIRST_RUN false, altrimenti non faccio niente.

Ma ho notato anche che queste preferenze rimangono intatti tra aggiornamento dell’app !

Così, dopo un aggiornamento, il FIRST_RUN chiave è già false, in modo che io non faccio niente, mentre il mio allarme bisogno di essere attivata.

Come gestire questi casi ?

Grazie in anticipo

OriginaleL’autore tbruyelle | 2010-01-25

4 Replies
  1. 57

    Non l’ho mai provato io stesso, ma per quanto riguarda la creazione di un BroadcastReceiver che ascolta la ACTION_PACKAGE_REPLACED Intento?

    Ho pensato di provare questo prima, ma io non sono sicuro se c’è un pollo-e-uovo problema o no (ad esempio, l’Intento di ottenere inviata prima della nuova applicazione può ricevere?). Vale la pena provare, anche se.

    Sì funziona ! Grazie Daniele, in realtà l’intento è inviata solo dopo l’aggiornamento, quindi il mio ricevitore è in grado di prendere. Mi chiedo solo ora, se il mio ricevitore sarà attivata in ogni aggiornamento di qualche applicazione ?
    Si attiverà ogni volta che si aggiorna, tuttavia nei documenti si dice che si può guardare l’Intento di dati e vi dirà il nome del pacchetto. Pertanto, è possibile utilizzare intento filtri per filtrare tutti i pacchetti sostituzioni che non sono le tue.
    L’app richiede autorizzazioni speciali per ascoltare PACKAGE_REPLACED?
    Come di API 12 è possibile utilizzare MY_PACKAGE_REPLACED: developer.android.com/reference/android/content/…
    Si prega di non utilizzare più questo. Il lancio della app processo per ogni aggiornamento di tutte le app, che è estremamente inefficiente. L’unico modo per filtrare un Intento con questa azione per limitare al vostro app utilizzando il provider di servizi di attributo che è disponibile solo su API 19+, quindi mi raccomando MY_PACKAGE_REPLACED solo.

    OriginaleL’autore Daniel Lew

  2. 88

    Soluzione da Daniel Lew :

    Bisogno di un ricevitore con le seguenti righe nel manifesto :

    <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 è utilizzato per prevenire OnUpgradeReceiver per essere attivato da qualsiasi aggiornamento di qualsiasi applicazione.

    Il percorso è utilizzato solo se lo schema si riferisce ad un gerarchica URI. Nel caso di “pacchetto”, che non fa riferimento a una struttura gerarchica URI, non è possibile passare una stringa di percorso. Tuttavia, <data android:scheme=”package”/> si allega il vostro pacchetto di applicazione per gli indirizzi in notazione URI (“package:il tuo.app.pacchetto”), così non hai bisogno di passare un percorso comunque.
    L’app richiede autorizzazioni speciali per ascoltare PACKAGE_REPLACED?
    No l’app non ha bisogno di un permesso speciale
    android:il percorso era esattamente quello che stavo cercando! Grazie!
    fantastico, grazie mille.. ha funzionato..

    OriginaleL’autore tbruyelle

  3. 19

    Semplicemente, ascoltare la android.intent.action.MY_PACKAGE_REPLACED … Questo INTENT notifica se una nuova versione dell’applicazione è stato installato su una esistente

    Nota: Questo intento è disponibile a partire da API 12

    Questo deve essere l’unica soluzione consigliata. Non c’è modo di filtrare adeguatamente android.l’intento.azione.PACKAGE_REPLACED per il locale solo per l’app prima di API 19, e con questa Intenzione innescare il lancio di app per ogni applicazione di installazione è estremamente inefficiente.

    OriginaleL’autore Sami Eltamawy

  4. 18

    Per il sistema operativo Android v12 e, soprattutto, si devono registrare BroadcastReceiver con azione ACTION_MY_PACKAGE_REPLACED

    <receiver android:name=".MyBroadcastReceiver">
      <intent-filter>
        <action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
      </intent-filter>
    </receiver>
    Questa è la risposta giusta se stai sostenendo moderni Sistemi operativi Android. Per la maggior parte delle applicazioni (Gingerbread è al 1% a questo quota di mercato), utilizzando MY_PACKAGE_REPLACED semplifica il broadcast receiver codice.

    OriginaleL’autore armansimonyan13

Lascia un commento