2009-10-20 17 views
5

Estoy intentando registrar un receptor de difusión para recibir eventos de transmisión para los eventos de paquete. A continuación está el código y mi receptor en el archivo de manifiesto. La declaración de registro nunca ocurre, pero puedo ver claramente la misma emisión de transmisión para las declaraciones de depuración de "HomeLoaders" (el Iniciador). ¿Qué me estoy perdiendo?No se pueden recibir transmisiones para intenciones de PAQUETE

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

el error puede estar en IntentListener en lugar de com.android.samples.app.IntentListener? – Zorb

Respuesta

4

Es posible que estos Intent s no pueden ser recibidas por los componentes registrados en el manifiesto, sino sólo por los receptores registrados en Java a través de registerReceiver().

+0

Sí, estoy bastante seguro de que ese es el caso, por curiosidad ¿por qué es este el caso? No veo ninguna implicancia de seguridad de esto? –

+3

Como ya comenté otra pregunta de SO hace un día, Android no siempre quiere iniciar un componente nuevo todo el tiempo. El único caso que conocí fue por eventos de batería (por ejemplo, ACTION_BATTERY_LOW). Parece que SCREEN_OFF (y quizás SCREEN_ON) son otros. Si lo piensas y lo haces funcionar con registerReceiver(), repítelo. Creo que necesito cubrir este tema en una publicación de blog y/o sección de libros, y desafortunadamente la lista de Intentos no-manifiestos-receptores no está documentada. – CommonsWare

+1

Me gustaría ver dónde está documentado esto. He inspeccionado la fuente y el único control contra estas transmisiones protegidas es para que un proceso que no sea del sistema no pueda iniciar una transmisión. También he visto otros paquetes en el registro fuente para esta intención a través del manifiesto solamente. – James

0

Esta es mi manifiesto, sin

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

Mi aplicación detecta sólo el Android Market instalación de la aplicación, pero no elimina. Ahora también recibe las transmisiones de aplicaciones que no pertenecen a Android Market.

<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

Estos tres intentos a saber,

Intent.ACTION_PACKAGE_ADDED 
Intent.ACTION_PACKAGE_REMOVED 
Intent.ACTION_PACKAGE_CHANGED 

cuando transmitido por el sistema, tienen

Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT 

indicación añadida para que sólo los receptores registrados recibirán las transmisiones y ningún componente receptor de radiodifusión se pondrá en marcha. Consulte la clase de origen Intent y PackageManagerService para obtener más detalles.

Cuestiones relacionadas