2010-12-22 12 views
20

Uygulamam ve yalnızca benim uygulamam için değiştirilen paketi yakalamaya çalışıyorum, ancak alıcımın herhangi bir nedenle güncellenen her uygulama için yayınım. Sadece manifest dosyasında niyet filtresini uygulamanıza ayarlamanız gerektiğini düşündüm, ama belki yanılıyor muyum?Paket değiştirilen yayın doğru şekilde nasıl filtrelenir

 <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

: yol 'kısmı gereksizdir. – ThomasW

+0

Filtrede yol sağlarsanız, alıcıda verileri tekrar kontrol etmek gereksizdir. [Niyet ve Filtreler] 'i (https://developer.android.com/guide/components/intents-filters.html) ve [ihtiyacınız olabilecekleri] kontrol edin (https://developer.android.com/reference/android/content /Intent.html#ACTION_PACKAGE_REPLACED) –

cevap

35

sizin OnReceive yöntemine ekleyin:

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

DÜZENLEME: için kayıt olduğunu Not İşte

(apaçık) kod bu ACTION_PACKAGE_REPLACED, y Henüz açık değilse, herhangi bir uygulama güncellendiğinde bizim app başlatılacak. API 12'den önce bunu nasıl önleyebileceğimi bilmiyorum, ancak API 12'de ACTION_MY_PACKAGE_REPLACED'a kayıt olabilirsiniz, bu nedenle niyetinizi filtrelemeniz gerekmez ve uygulamanız güncellenmekte olan diğer uygulamalar tarafından gereksiz yere başlatılmayacaktır.

+0

Bu nedenle, yalnızca geçerli uygulamanın amaçlarına kaydolmanın bir yolu yok mu? bir google geliştiricisi ("Dianne Hackborn" olarak adlandırılır) mümkün olduğunu düşünüyor: http://osdir.com/ml/Android-Developers/2009-11/msg04736.html –

+0

Bu bir yol olduğunu ima eder, ama ben asla bunu anladım. Honeycomb'da, "ACTION_PACKAGE_REPLACED" ile ilgili sorunu önlemek için 'ACTION_MY_PACKAGE_REPLACED' işlevini kullanabilirsiniz: http://developer.android.com/reference/android/content/Intent.html#ACTION_MY_PACKAGE_REPLACED – Tenfour04

+0

evet, ancak daha eskileri bulamıyorum Bu yüzden, burada yaptığım gibi, her iki yöntemi de kullanan bir geri dönüş: http://stackoverflow.com/a/21510561/878126. –

1

Alternatif olarak, kod birden çok uygulamada yer alan veya aldığı bir kütüphanede ise sadece kopyası olabilir şey istiyorsanız/düzenlemeler olmadan uygulamalar arasında yapıştırılan: Benim testlerde, `android itibaren

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