2010-12-22 2 views
20

J'essaie d'attraper la diffusion remplacée de paquet pour mon application et seulement mon application, mais pour une raison quelconque dans mon récepteur, je suis la diffusion pour chaque application qui est mise à jour. Je pensais que vous aviez seulement besoin de définir le filtre d'intention dans le fichier manifeste à votre application, mais peut-être que je me trompe?Comment filtrer correctement Package remplacé diffusion

Voici mon code (manifeste):

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

Reciever:

public class AppUpdateReciever extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context con, Intent intent) { 

     //code..  
    } 

} 
+0

De mes tests, le 'Android: la partie du chemin est inutile. – ThomasW

+0

Si vous indiquez le chemin dans le filtre, il est inutile de vérifier à nouveau les données dans le récepteur. Cochez [Intention et filtres] (https://developer.android.com/guide/components/intents-filters.html) et [intentions dont vous pourriez avoir besoin] (https://developer.android.com/reference/android/content /Intent.html#ACTION_PACKAGE_REPLACED) –

Répondre

35

Ajouter à votre méthode OnReceive:

if (intent.getDataString().contains("com.my.app")){ 
    ... 
} 

EDIT: Notez que l'inscription à ACTION_PACKAGE_REPLACED causes y notre application doit être démarrée chaque fois qu'une application est mise à jour, si elle n'était pas déjà ouverte. Je ne sais pas comment éviter cela avant API 12, mais dans API 12, vous pouvez vous inscrire pour ACTION_MY_PACKAGE_REPLACED de sorte que vous n'avez pas à filtrer l'intention et votre application ne sera pas démarrée inutilement par d'autres applications en cours de mise à jour.

+0

donc il n'y a aucun moyen de s'inscrire uniquement aux intentions de l'application en cours? il semble qu'un développeur google (nommé "Dianne Hackborn") pense que c'est possible: http://osdir.com/ml/Android-Developers/2009-11/msg04736.html –

+0

Cela implique qu'il y avait un moyen, mais je n'ai jamais deviner. Dans Honeycomb, vous pouvez utiliser 'ACTION_MY_PACKAGE_REPLACED' pour éviter le problème avec' ACTION_PACKAGE_REPLACED': http://developer.android.com/reference/android/content/Intent.html#ACTION_MY_PACKAGE_REPLACED – Tenfour04

+0

oui, mais je ne trouve pas l'ancien façon, donc ce que j'ai fait est un fallback qui utilise les deux méthodes, comme je l'ai montré ici: http://stackoverflow.com/a/21510561/878126. –

1

Alternativement, si votre code est dans une bibliothèque qui est inclus dans plusieurs applications, ou si vous voulez juste quelque chose qui peut être copier/coller entre les applications sans modifications:

int intentUid = intent.getExtras().getInt("android.intent.extra.UID"); 
int myUid = android.os.Process.myUid(); 
if (intentUid == myUid) 
{ 
    ... 
} 
Questions connexes