web-dev-qa-db-fra.com

Classe de récepteur de diffusion et méthode registerReceiver

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) {
        .................
    }

};
13
user2717079

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);
    }
}
42
Bhoomika Brahmbhatt

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.

2
sergej shafarenka

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