2010-12-22 3 views
20

Ich versuche, das Paket ersetzt Broadcast für meine App und nur meine App zu fangen, aber aus irgendeinem Grund in meinem Empfänger bin ich die Sendung für jede App, die aktualisiert wird. Ich dachte, Sie müssten nur den Intent-Filter in der Manifest-Datei zu Ihrer App setzen, aber vielleicht liege ich falsch?Wie Paket Sendungsaustausch korrekt zu filtern

Hier ist mein Code (Manifest):

 <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

Von meinen Tests, die 'android: Pfadabschnitt ist unnötig. – ThomasW

+0

Wenn Sie den Pfad im Filter angeben, müssen Sie die Daten im Empfänger nicht erneut überprüfen. Überprüfen Sie [Intent und Filter] (https://developer.android.com/guide/components/intents-filters.html) und [Intents, die Sie möglicherweise benötigen] (https://developer.android.com/reference/android/content) /Intent.html#ACTION_PACKAGE_REPLACED) –

Antwort

35

Fügen Sie diese auf Ihre OnReceive Methode:

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

EDIT: Beachten Sie, dass die Registrierung für ACTION_PACKAGE_REPLACED verursacht y Unsere App wird jedes Mal gestartet, wenn eine App aktualisiert wird, falls sie nicht bereits geöffnet war. Ich weiß nicht, wie ich dies vor API 12 vermeiden kann, aber in API 12 können Sie sich für ACTION_MY_PACKAGE_REPLACED registrieren, sodass Sie die Absicht nicht filtern müssen und Ihre App nicht unnötigerweise von anderen Apps gestartet wird, die aktualisiert werden.

+0

also gibt es keine Möglichkeit, nur zu Intents der aktuellen App zu registrieren? es scheint ein Google-Entwickler (namens "Dianne Hackborn") denkt, dass es möglich ist: http://osdir.com/ml/Android-Developers/2009-11/msg04736.html –

+0

Das bedeutet, dass es einen Weg gab, aber ich nie herausgefunden. In Honeycomb können Sie 'ACTION_MY_PACKAGE_REPLACED' verwenden, um das Problem mit' ACTION_PACKAGE_REPLACED' zu vermeiden: http://developer.android.com/reference/android/content/Intent.html#ACTION_MY_PACKAGE_REPLACED – Tenfour04

+0

Ja, aber ich kann die älteren nicht finden so, was ich getan habe, ist ein Fallback, die beide Methoden verwendet, wie ich hier gezeigt habe: http://StackOverflow.com/a/21510561/878126. –

1

Alternativ kann, wenn Ihr Code in einer Bibliothek, die in mehreren Anwendungen enthalten ist, oder wenn Sie nur wollen etwas, das Kopieren/Einfügen zwischen Anwendungen ohne Änderungen sein kann:

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