2011-06-30 13 views
37

saber acerca del uso registerReceiver y unregisterReceiver en código Java para hacer frente a los receptores, pero vamos a decir que tengo el siguiente en mi manifiesta:Android: ¿cómo anular el registro de un receptor creado en el manifiesto?

<receiver android:name=".headsetHook"> 
     <intent-filter android:priority="99999999999"> 
      <action android:name="android.intent.action.ACTION_HEADSET_PLUG" /> 
     </intent-filter> 
    </receiver> 

¿Hay alguna manera de que pudiera anular el registro de esto en alguna parte en código Java? ¿Podría darle un atributo de identificación o algo así y luego obtenerlo y anular el registro? Lo pido porque quiero que mi aplicación haga algo solo la primera vez que ocurre esta acción, luego lo anulo y lo vuelvo a registrar más tarde en Java.

Espero haber dejado eso en claro, gracias por cualquier ayuda.

Respuesta

78

Puede usar el PackageManager para habilitar/deshabilitar un BroadcastReceiver en declarado en el Manifiesto. El Broadcast Receiver se activará solo cuando esté habilitado.

Utilice esta opción para crear un componente

ComponentName component = new ComponentName(context, MyReceiver.class); 

Comprobar si está habilitado el componente o discapacitados

int status = context.getPackageManager().getComponentEnabledSetting(component); 
if(status == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) { 
    Log.d("receiver is enabled"); 
} else if(status == PackageManager.COMPONENT_ENABLED_STATE_DISABLED) { 
    Log.d("receiver is disabled"); 
} 

activar/desactivar el componente (receptor transmita en su caso)

//Disable 
context.getPackageManager().setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_DISABLED , PackageManager.DONT_KILL_APP); 
//Enable 
context.getPackageManager().setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_ENABLED , PackageManager.DONT_KILL_APP); 
+1

oh maldito eres un jefe. Déjame probar esto, parece prometedor. – JDS

+3

Solo tenga en cuenta: también puede obtener el estado COMPONENT_ENABLED_STATE_DEFAULT –

+0

@Varun +1 Gran respuesta ... Trabajar bien ... – Venky

0

Basado en la respuesta de Varun He creado este método utilitario

private void unregisterReceiverFromManifest(Class<? extends BroadcastReceiver> clazz, final Context context) { 
    final ComponentName component = new ComponentName(context, clazz); 
    final int status = context.getPackageManager().getComponentEnabledSetting(component); 
    if(status == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) { 
     context.getPackageManager() 
       .setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
        PackageManager.DONT_KILL_APP); 
     } 
    } 
Cuestiones relacionadas