2009-10-20 12 views
5

Próbuję zarejestrować odbiornik Broadcast do odbierania transmisji wydarzeń związanych z pakietami. Poniżej znajduje się kod i mój odbiorca w pliku manifestu. Dziennik nigdy się nie dzieje, ale wyraźnie widzę to samo uruchamianie emisji dla poleceń debugowania "HomeLoaders" (Launcher). czego mi brakuje?Nie można odbierać transmisji dla intencji PAKIETU

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

błąd może być w IntentListener zamiast com.android.samples.app.IntentListener? – Zorb

Odpowiedz

4

Jest możliwe, że te Intent s nie mogą być odbierane przez składniki zarejestrowane w manifeście, ale tylko przez odbiorniki zarejestrowane w Javie poprzez registerReceiver().

+0

Tak, jestem pewien, że tak, z ciekawości, dlaczego tak jest? Nie widzę żadnych skutków dla bezpieczeństwa tego? –

+3

Jak skomentowałem na inne pytanie SO dzień lub więc temu, Android niekoniecznie chce uruchomić nowy komponent przez cały czas. Jedyne znane mi przypadki dotyczyły zdarzeń związanych z baterią (np. ACTION_BATTERY_LOW). Wygląda na to, że SCREEN_OFF (i może SCREEN_ON) to inne. Jeśli myślisz o tym i działasz z registerReceiver(), odpowiedz na ten problem. Myślę, że muszę omówić ten temat w blogu i/lub dziale książki, a niestety lista intencji nie-manifest-odbiornika jest nieudokumentowana. – CommonsWare

+1

Chciałbym zobaczyć, gdzie to jest udokumentowane. Sprawdziłem źródło i jedyną metodą sprawdzenia tych chronionych transmisji jest to, że proces niesystemowy nie może zainicjować transmisji. Widziałem również inne pakiety w rejestrze źródłowym dla tego zamiaru tylko za pośrednictwem manifestu. – James

0

To jest mój manifest, bez

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

Moja aplikacja wykrywa tylko aplikację Android Market instalacji, ale nie usuwa. Teraz odbiera także transmisje aplikacji na rynek inny niż Android.

<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

Te trzy zamiary mianowicie

Intent.ACTION_PACKAGE_ADDED 
Intent.ACTION_PACKAGE_REMOVED 
Intent.ACTION_PACKAGE_CHANGED 

kiedy nadawany przez system, mają

Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT 

flag dodany tak, że tylko zarejestrowane odbiorniki będą odbierać audycje i żadnych składników odbiornika transmisji wystartuje. Więcej informacji na ten temat można znaleźć w klasie Intent i PackageManagerService źródła.

Powiązane problemy