Salut, j'essaie de comprendre le récepteur de diffusion, j'ai parcouru de nombreux exemples de codes, mais j'ai encore des doutes. Je voulais savoir quand nous devons étendre la classe Broadcast Receiver et quand devrions-nous utiliser la méthode registerReceiver()
et quand devrions-nous créer un objet pour BroadcastReceiver. Dans certains programmes, je suis tombé sur des méthodes registerReceiver
utilisées mais sans étendre la classe Broadcast Receiver. Je voulais également savoir comment la méthode onReceive
est appelée.
Quelle approche utiliser quand?
voici la méthode registerReceiver:
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
switch (getResultCode()) {
........
}
}
}, new IntentFilter(SENT));
Objet en cours de création pour BroadcastReceiver
:
private BroadcastReceiver intentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
.................
}
};
Android a action intentionnelle pour le récepteur de diffusion. récepteur BroadCast sera déclenché lors de l'écoute de toute action enregistrée en son sein.
Nous allons maintenant prendre un exemple: que nous devons écouter l'action de "chaque fois qu'un appareil Bluetooth se connecte à notre appareil". Pour cela Android a une action fixe Android.bluetooth.BluetoothDevice.ACTION_ACL_CONNECTED
Ainsi, vous pouvez également l'obtenir via le manifeste et l'inscription
PAR Inscription au manifeste:
Mettez ceci dans votre manifeste
<receiver Android:name="MyBTReceiver">
<intent-filter>
<action Android:name="Android.bluetooth.BluetoothDevice.ACTION_ACL_CONNECTED" />
</intent-filter>
</receiver>
Créez MyBTReceiver.class
public class MyBTReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals("Android.bluetooth.BluetoothDevice.ACTION_ACL_CONNECTED")){
Log.d(TAG,"Bluetooth connect");
}
}
}
C'était le récepteur de diffusion le plus simple.
Maintenant, si vous souhaitez uniquement recevoir une diffusion pendant que vous exécutez, il est préférable d'utiliser registerReceiver (). Vous pouvez également vous inscrire dans votre fichier de classe existant. vous devez également désinscrire it onDestroy()
. ici, vous n'avez pas besoin d'enregistrement de diffusion dans le manifeste, sauf l'enregistrement d'activité
Par exemple
public class MainActivity extends Activity {
IntentFilter filter1;
@Override
public void onCreate() {
filter1 = new IntentFilter("Android.bluetooth.BluetoothDevice.ACTION_ACL_CONNECTED");
registerReceiver(myReceiver, filter1);
}
//The BroadcastReceiver that listens for bluetooth broadcasts
private final BroadcastReceiver myReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equalsIgnoreCase("Android.bluetooth.BluetoothDevice.ACTION_ACL_CONNECTED")) {
Log.d(TAG,"Bluetooth connect");
}
}
};
@Override
public void onDestroy() {
unregisterReceiver(myReceiver);
}
}
Dans les deux cas, BroadcastReceiver
sera étendu. Dans votre deuxième exemple, vous créez une classe dite anonyme. La nouvelle classe n'a pas de nom spécifique, c'est pourquoi elle est appelée ainsi. Quoi qu'il en soit, cette nouvelle classe étend la méthode BroadcastReceiver
et remplace la méthode onReceive()
.
Revenons maintenant à votre question. Il existe deux types de récepteurs - ceux définis statiquement et dynamiquement.
Si vous déclarez votre récepteur dans le fichier AndroidManifest, il est alors défini statiquement. Dans ce cas, vous devez vous référer à une classe implémentant BroadcastReceiver par son nom. Comme vous pouvez le voir, vous ne pouvez pas utiliser une classe anonyme, car la dernière n'a pas de nom. Vous devez implémenter explicitement un récepteur. Il convient de mentionner que dans ce cas, vous n'utilisez pasregisterReceiver()
méthode. Android le fait automatiquement pour vous.
Si vous déclarez des récepteurs dynamiquement (par exemple dans la méthode onResume()
de l'activité), vous pouvez utiliser une classe anonyme pour cela. Pour enregistrer un récepteur, vous appelez la méthode registerReceiver()
. Vous pouvez également utiliser une classe nommée également. Les deux options sont valables dans ce cas.
J'espère que cela explique la différence.
Dans les deux cas, vous créez un objet, mais dans le premier cas, il n'y a pas de référence pour l'objet récepteur, il ne peut donc pas être désinscrit plus tard, mais le second l'a pour qu'il puisse être désinscrit après avoir enregistré l'objet en utilisant ci-dessous méthodes :
registerReceiver(intentReceiver );
unregisterReceiver(intentReceiver );