por imagenes imagen google busqueda buscar avanzada android broadcastreceiver

android - imagenes - Registrar programáticamente un receptor de difusión



google imagenes busqueda avanzada (9)

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.


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 .


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 intento de coincidencia. Esto puede permitir que las aplicaciones maliciosas se transmitan a su receptor.


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.



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 intentos 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 intentos 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.


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);


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(); }


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(); } }