2009-10-20 18 views
5

Paket olayları için yayın olaylarını almak üzere bir Yayın Alıcısı kaydettirmeye çalışıyorum. Aşağıdaki kod ve manifest dosyasındaki alıcım. Günlük kaydı asla gerçekleşmez, ancak "HomeLoaders" (Launcher) hata ayıklama ifadeleri için aynı yayın ateşlemesini açıkça görebiliyorum. Neyi kaçırıyorum?PAKET amaçlarına yönelik yayınlar alınamıyor

public class IntentListener extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // TODO Auto-generated method stub 
     Log.i("INTENT LISTNER:", intent.getAction()); 
    } 
} 

<receiver android:name="IntentListener" android:enabled="true" android:exported="true"> 
    <intent-filter> 
     <data android:scheme="package"></data> 
     <action android:name="android.intent.action.PACKAGE_ADDED"></action> 
     <action android:name="android.intent.action.PACKAGE_ADDED"></action> 
     <action android:name="android.intent.action.PACKAGE_CHANGED"></action> 
    </intent-filter> 
</receiver> 
+1

hata, com.android.samples.app.IntentListener yerine IntentListener içinde olabilir mi? – Zorb

cevap

4

Intent ler manifest'te kayıtlı bileşenleri tarafından alınamaz mümkündür, fakat sadece registerReceiver() aracılığıyla Java kayıtlı alıcıları tarafından.

+0

Yea, eminim ki durum, meraktan dolayı durum neden bu? Bunun herhangi bir güvenlik yansıması görmüyorum? –

+3

Bir Günde veya daha önce bir SO sorusuna daha önce değindiğim gibi, Android her zaman yeni bir bileşen kurmak istemiyor. Bildiğim tek vaka batarya olaylarıydı (ör. ACTION_BATTERY_LOW). SCREEN_OFF (ve belki de SCREEN_ON) başkaları gibi görünüyor. Eğer düşünürseniz, ve onu registerReceiver() ile çalıştırırsanız, bu konuya geri dönün. Bu konuyu bir blog gönderisinde ve/veya kitap bölümünde ele almam gerektiğini düşünüyorum ve maalesef, açıklamamıza sahip olmayan Alıcıların listesi belgelenmemiş. – CommonsWare

+1

Bunun nerede belgelendiğini görmek istiyorum. Kaynağı denetledim ve bu korumalı yayınlara karşı tek onay, sistem dışı bir sürecin bir yayını başlatamamasıdır. Bu niyet için kaynak kayıtta yalnızca başka bir paket aracılığıyla başka paketler de gördüm. – James

0

Bu

<category android:name="android.intent.category.DEFAULT" /> 

Benim uygulaması yalnızca Android Market uygulamasını yükleyin algılar olmadan, benim apaçık olmakla kaldırmaz. Şimdi de Android Market dışı uygulama yayınlarını alıyor.

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <activity 
     android:label="@string/app_name" 
     android:name=".SomeActivity" > 
     <intent-filter > 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <receiver android:name="com.som.pakage.PackageInstallReceiver" > 
     <intent-filter > 
      <action android:name="android.intent.action.PACKAGE_ADDED" /> 
      <action android:name="android.intent.action.PACKAGE_REMOVED" /> 

      <category android:name="android.intent.category.DEFAULT" /> 
      <data android:scheme="package" /> 
     </intent-filter> 
    </receiver> 
</application> 
0

yani bu üç intents,

sistem tarafından yayınlanan
Intent.ACTION_PACKAGE_ADDED 
Intent.ACTION_PACKAGE_REMOVED 
Intent.ACTION_PACKAGE_CHANGED 

, sadece kayıtlı alıcılar yayınları ve hiçbir yayın alıcısı bileşenlerini alacak şekilde

Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT 

bayrak eklenen Başlayacak. Daha fazla ayrıntı için Intent ve PackageManagerService kaynağına bakın.