Registrar programáticamente un receptor de difusión

Me gustaría saber cuál es la mejor práctica / forma de registrar programáticamente un receptor de difusión. Quiero registrar receptores específicos de acuerdo con la elección del usuario.

Como el registro se realiza a través del archivo de manifiesto, me pregunto si hay una forma adecuada de lograr esto en el código.

Parece que desea controlar si los componentes publicados en su manifiesto están activos, no registrar dinámicamente un receptor (a través de Context.registerReceiver ()) mientras se ejecuta.

Si es así, puede usar PackageManager.setComponentEnabledSetting () para controlar si estos componentes están activos:

http://developer.android.com/reference/android/content/pm/PackageManager.html#setComponentEnabledSetting(android.content.ComponentName, int, int)

Tenga en cuenta que si solo está interesado en recibir una transmisión mientras se está ejecutando, es mejor utilizar registerReceiver (). Un componente de recepción es útil principalmente cuando necesita asegurarse de que su aplicación se inicia cada vez que se envía la transmisión.

En su método onCreate puede registrar un receptor como este:

 private BroadcastReceiver receiver; @Override public void onCreate(Bundle savedInstanceState){ // your oncreate code should be IntentFilter filter = new IntentFilter(); filter.addAction("SOME_ACTION"); filter.addAction("SOME_OTHER_ACTION"); receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { //do something based on the intent's action } }; registerReceiver(receiver, filter); } 

Recuerde ejecutar esto en el método onDestroy :

  @Override protected void onDestroy() { if (receiver != null) { unregisterReceiver(receiver); receiver = null; } super.onDestroy(); } 

Un punto importante que la gente olvida mencionar es el tiempo de vida del Broadcast Receiver . La diferencia de registrarlo programáticamente para que no se registre en AndroidManifest.xml es eso. En el archivo de manifiesto, no depende del tiempo de vida de la aplicación. Mientras que al registrarlo programáticamente depende del tiempo de vida de la aplicación. Esto significa que si te registras en AndroidManifest.xml , puedes capturar los bashs emitidos incluso cuando tu aplicación no se esté ejecutando.

Editar: La nota mencionada ya no es válida a partir de Android 3.1, el sistema Android excluye todos los receptores de las intenciones de recepción por defecto si la aplicación correspondiente nunca ha sido iniciada por el usuario o si el usuario detuvo la aplicación explícitamente a través del menú de Android (en Administrar → Aplicación). https://developer.android.com/about/versions/android-3.1.html

Esta es una característica de seguridad adicional, ya que el usuario puede estar seguro de que solo las aplicaciones que inició recibirán bashs de transmisión.

Por lo tanto, se puede entender como los receptores registrados programáticamente en Application onCreate() tendrían el mismo efecto que los declarados en AndroidManifest.xml de Android 3.1.

Defina un receptor de difusión en cualquier lugar de la Actividad / Fragmento de esta manera:

 mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.d(TAG," onRecieve"); //do something with intent } }; 

Definir IntentFilter en onCreate ()

 mIntentFilter=new IntentFilter("action_name"); 

Ahora registre BroadcastReciever en onResume () y elimine el registro en onPause [porque no hay uso de difusión si la actividad está en pausa].

 @Override protected void onResume() { super.onResume(); registerReceiver(mReceiver, mIntentFilter); } @Override protected void onPause() { if(mReceiver != null) { unregisterReceiver(mReceiver); mReceiver = null; } super.onPause(); } 

Para un tutorial detallado, eche un vistazo al receptor de difusión: dos formas de implementarlo .

 package com.example.broadcastreceiver; import android.app.Activity; import android.content.IntentFilter; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.widget.Toast; public class MainActivity extends Activity { UserDefinedBroadcastReceiver broadCastReceiver = new UserDefinedBroadcastReceiver(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } /** * This method enables the Broadcast receiver for * "android.intent.action.TIME_TICK" intent. This intent get * broadcasted every minute. * * @param view */ public void registerBroadcastReceiver(View view) { this.registerReceiver(broadCastReceiver, new IntentFilter( "android.intent.action.TIME_TICK")); Toast.makeText(this, "Registered broadcast receiver", Toast.LENGTH_SHORT) .show(); } /** * This method disables the Broadcast receiver * * @param view */ public void unregisterBroadcastReceiver(View view) { this.unregisterReceiver(broadCastReceiver); Toast.makeText(this, "unregistered broadcst receiver", Toast.LENGTH_SHORT) .show(); } } 

Según Listening For y Broadcasting Global Messages, y configuración de alarmas en tareas comunes y cómo hacerlas en Android :

Si la clase de recepción no está registrada en su manifiesto, puede crear instancias dinámicas y registrar un receptor llamando a Context.registerReceiver () .

Eche un vistazo a registerReceiver (receptor BroadcastReceiver, filtro IntentFilter) para obtener más información.

Es una buena práctica proporcionar siempre el permiso al registrar el receptor; de lo contrario, recibirá para cualquier aplicación que envíe un bash de coincidencia. Esto puede permitir que las aplicaciones maliciosas se transmitan a su receptor.

para LocalBroadcastManager

  Intent intent = new Intent("any.action.string"); LocalBroadcastManager.getInstance(context). sendBroadcast(intent); 

y registrarse en onResume

 LocalBroadcastManager.getInstance( ActivityName.this).registerReceiver(chatCountBroadcastReceiver, filter); 

y onStop registro en onStop

 LocalBroadcastManager.getInstance( ActivityName.this).unregisterReceiver(chatCountBroadcastReceiver); 

y lo recibe ..

 mBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.e("mBroadcastReceiver", "onReceive"); } }; 

donde IntentFilter es

  new IntentFilter("any.action.string") 

Crear un receptor de difusión

[BroadcastReceiver (habilitado = verdadero, exportado = falso)]

 public class BCReceiver : BroadcastReceiver { BCReceiver receiver; public override void OnReceive(Context context, Intent intent) { //Do something here } } 

De su actividad agregue este código:

 LocalBroadcastManager.getInstance(ApplicationContext) .registerReceiver(receiver, filter);