Enregistrer par programme un récepteur de diffusion

Je voudrais savoir quelle est la meilleure pratique / méthode pour enregistrer par programmation un récepteur de diffusion. Je souhaite enregistrer des récepteurs spécifiques en fonction du choix de l’utilisateur.

Comme l’inscription se fait via le fichier manifeste, je me demande s’il existe un moyen approprié d’y parvenir dans le code.

Il semble que vous vouliez contrôler si les composants publiés dans votre manifeste sont actifs, et non pas enregistrer un récepteur de manière dynamic (via Context.registerReceiver ()) en cours d’exécution.

Si tel est le cas, vous pouvez utiliser PackageManager.setComponentEnabledSetting () pour contrôler si ces composants sont actifs:

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

Notez que si vous souhaitez uniquement recevoir une diffusion en cours d’exécution, il est préférable d’utiliser registerReceiver (). Un composant récepteur est principalement utile lorsque vous devez vous assurer que votre application est lancée chaque fois que la diffusion est envoyée.

Dans votre méthode onCreate , vous pouvez enregistrer un récepteur comme ceci:

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

N’oubliez pas de l’exécuter dans la méthode onDestroy :

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

Un point important que les gens oublient de mentionner est la durée de vie du Broadcast Receiver . La différence de l’enregistrement par programme lors de l’enregistrement dans AndroidManifest.xml est la suivante. Dans le fichier manifeste, cela ne dépend pas de la durée de vie de l’application. Lorsque vous l’enregistrez par programmation, cela dépend de la durée de vie de l’application. Cela signifie que si vous vous enregistrez dans AndroidManifest.xml , vous pouvez intercepter les intentions diffusées même lorsque votre application n’est pas en cours d’exécution.

Edit: La note mentionnée n’est plus vraie à partir d’Android 3.1, le système Android exclut tout récepteur de recevoir des intentions par défaut si l’application correspondante n’a jamais été lancée par l’utilisateur ou si l’utilisateur a explicitement arrêté l’application via le menu Android (dans Gérer → Application). https://developer.android.com/about/versions/android-3.1.html

Ceci est une fonctionnalité de sécurité supplémentaire car l’utilisateur peut être sûr que seules les applications qu’il a démarrées recevront des intentions de diffusion.

On peut donc comprendre que les récepteurs enregistrés par programme dans l’application onCreate() auraient le même effet avec ceux déclarés dans AndroidManifest.xml à partir d’Android 3.1 ci-dessus.

Définissez un récepteur de diffusion n’importe où dans Activity / Fragment comme ceci:

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

Définir IntentFilter dans onCreate ()

 mIntentFilter=new IntentFilter("action_name"); 

Maintenant, enregistrez le BroadcastReciever dans onResume () et désinscrivez-le dans onPause [car la diffusion n’est pas utilisée si l’activité est en pause].

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

Pour un didacticiel détaillé, jetez un coup d’œil au récepteur de diffusion, deux manières d’implémenter .

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

Selon l’écoute et la diffusion de messages globaux, et la définition d’alarmes dans les tâches courantes et leur fonctionnement sous Android :

Si la classe de réception n’est pas enregistrée avec son manifeste, vous pouvez instancier et enregistrer dynamicment un récepteur en appelant Context.registerReceiver () .

Jetez un coup d’œil à registerReceiver (récepteur BroadcastReceiver, filtre IntentFilter) pour plus d’informations.

Il est recommandé de toujours fournir l’autorisation lors de l’enregistrement du récepteur, sinon vous recevrez pour toute application qui envoie une intention correspondante. Cela peut permettre à des applications malveillantes de diffuser sur votre récepteur.

pour LocalBroadcastManager

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

et s’inscrire sur onResume

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

et onStop

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

et le recevoir ..

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

où IntentFilter est

  new IntentFilter("any.action.ssortingng") 

Créer un récepteur de diffusion

[BroadcastReceiver (Enabled = true, Exported = false)]

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

De votre activité ajoutez ce code:

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