Introduction à cette section

Dans cette section, nous allons apprendre le troisième des quatre composants majeurs d'Android : BroadcastReceiver (récepteur de diffusion). Héhé, je réfléchissais justement à la manière d'écrire le mot d'ouverture, alors j'ai feuilleté deux livres sur les bases d'Android que j'ai sous la main, et j'ai constaté qu'aucun des deux n'introduisait BroadcastReceiver. Je ne sais pas si c'est une coïncidence ou si les auteurs pensaient que cette chose n'était pas très utilisée et ne valait pas la peine d'être mentionnée ! Cependant, même s'ils n'en parlent pas, Piggy en parlera, et en détail ! Bon, commençons cette section ~ PS : Oh, sur le site officiel d'Android, en ouvrant API Guides -> App Components, je n'ai pas non plus trouvé de trace de BroadcastReceiver. Bon, alors cherchons directement BroadcastReceiver. L'adresse de la documentation correspondante est :BroadcastReceiver


1. Mais qu'est-ce que c'est que BroadcastReceiver, bon sang ?

Réponse : Broadcast signifie littéralement « diffusion ». Laissez-moi donner un exemple vivant pour nous aider à comprendre BroadcastReceiver. Je me souviens que lorsque j'étudiais, chaque classe avait un grand haut-parleur accroché au mur, utilisé pour diffuser certaines annonces. Par exemple, à la rentrée, quand il fallait déplacer des livres, l'annonce disait : « Chaque classe, envoyez quelques élèves au bureau des affaires académiques pour récupérer les livres. » Une fois cette diffusion envoyée, tous les élèves recevront cette notification de diffusion au même moment. Ils la reçoivent, mais tous les élèves n'iront pas déplacer les livres. En général, ceux qui y vont sont les « costauds » de la classe. Après que ce groupe de « costauds » a reçu la diffusion, ils partiront rapporter les livres.
- Eh bien, ce qui précède est un exemple très parlant d'envoi de broadcast :
Grand haut-parleur --> envoie la diffusion --> tous les élèves peuvent recevoir la diffusion --> les costauds traitent la diffusion
Revenons à notre concept. En fait, BroadcastReceiver est un haut-parleur global entre les applications, c'est-à-dire un moyen de communication. Le système lui-même envoie des diffusions dans de nombreuses situations, comme une batterie faible ou suffisante, juste après le démarrage, l'insertion d'un casque, le changement de méthode de saisie, etc. Lorsque ces événements se produisent, le système envoie des diffusions. Celles-ci sont appelées diffusions système, et chaque APP les recevra. Si vous souhaitez que votre application effectue certaines opérations lorsqu'elle reçoit cette diffusion, par exemple, exécuter secrètement un service en arrière-plan après le démarrage du système — haha, alors vous devez simplement enregistrer un BroadcastReceiver pour que votre application surveille le démarrage. Lorsqu'il reçoit la diffusion de démarrage, il peut faire des choses en douce. Bien sûr, nous pouvons aussi envoyer des diffusions nous-mêmes. Par exemple, lorsqu'une notification push est reçue du serveur et que l'utilisateur se connecte ailleurs, vous devez forcer la déconnexion de l'utilisateur, revenir à l'écran de connexion et l'informer qu'il s'est connecté ailleurs. Bien sûr, nous écrirons un exemple simple plus tard pour aider tout le monde à comprendre les avantages que les diffusions nous apportent.


2. Deux types de diffusions :


3. Réception des diffusions système

1) Deux façons d'enregistrer des diffusions

Comme mentionné précédemment, le système envoie les diffusions système correspondantes à certains moments. Ensuite, faisons en sorte que notre APP reçoive les diffusions système. Avant de les recevoir, nous devons également enregistrer un récepteur de diffusion pour notre APP ! Il existe deux façons d'enregistrer : dynamique et statique !

Ci-dessous, nous allons démontrer l'utilisation et les différences entre les deux à travers du code :

2) Exemple d'enregistrement dynamique (écoute des changements d'état du réseau)

Exemple de code :

Capture d'écran du résultat :

Eh bien, au début, il n'y avait pas de connexion réseau, ce qui signifie que le Wi-Fi n'était pas activé. Après avoir cliqué pour activer le Wi-Fi, un message Toast est apparu après un moment. C'est aussi très simple à implémenter !

Implémentation du code :

Définissez un BroadcastReceiver personnalisé et effectuez dans la méthode onReceive() les traitements à réaliser dans la diffusion, comme la notification Toast ici : MyBRReceiver.java

public class MyBRReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"网络状态发生改变~",Toast.LENGTH_SHORT).show();
    }
}

MainActivity.javaEnregistrement dynamique de la diffusion :

public class MainActivity extends AppCompatActivity {

    MyBRReceiver myReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //核心部分代码:
        myReceiver = new MyBRReceiver();
        IntentFilter itFilter = new IntentFilter();
        itFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        registerReceiver(myReceiver, itFilter);
    }

    //别忘了将广播取消掉哦~
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(myReceiver);
    }
}

L'enregistrement dynamique est simple, non ? Mais l'enregistrement dynamique présente un inconvénient : le programme doit être démarré pour recevoir les diffusions. Si nous devons recevoir des diffusions même lorsque le programme n'est pas démarré, alors nous devons enregistrer une diffusion statique !


3) Exemple d'enregistrement statique (réception de la diffusion de démarrage)

Exemple de code :

Il n'y a pas de schéma illustratif ici. Regardons simplement l'implémentation du code.

Implémentation du code :

1. Définissez un BroadcastReceiver personnalisé et redéfinissez onReceive pour gérer le traitement.

public class BootCompleteReceiver extends BroadcastReceiver {
    private final String ACTION_BOOT = "android.intent.action.BOOT_COMPLETED";
    @Override
    public void onReceive(Context context, Intent intent) {
    if (ACTION_BOOT.equals(intent.getAction()))
        Toast.makeText(context, "开机完毕~", Toast.LENGTH_LONG).show();
    }
}

2. Enregistrez ce BroadcastReceiver dans AndroidManifest.xml et ajoutez l'intent-filter pour la diffusion de démarrage !

Oh, n'oubliez pas d'ajouter la permission android.permission.RECEIVE_BOOT_COMPLETED !

<receiver android:name=".BootCompleteReceiver">
    <intent-filter>
        <action android:name = "android.intent.cation.BOOT_COMPLETED">
    </intent-filter>
</receiver>

<!-- 权限 -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

Eh bien, redémarrez ensuite votre téléphone et vous constaterez qu'au bout d'un moment, le Toast indiquant « boot complete » apparaîtra. De plus, Android 4.3 et versions supérieures permettent d'installer des programmes sur la carte SD. Si votre programme est installé sur la carte SD, vous ne recevrez pas la diffusion de démarrage. Nous expliquerons les raisons précises et les solutions dans la section suivante !


4) Remarques sur l'utilisation des diffusions :

Héhé, les diffusions sont faciles à utiliser et simples, mais il y a des choses à noter lors de l'utilisation des diffusions :

N'ajoutez pas trop de logique et n'effectuez pas d'opérations chronophages dans une diffusion, car il n'est pas permis d'ouvrir des threads dans une diffusion. Si la méthode onReceive() s'exécute pendant longtemps (plus de 10 secondes) sans se terminer, le programme signalera une erreur (ANR). Les diffusions jouent plus souvent un rôle d'ouverture d'autres composants, comme le démarrage d'un Service, des invites de Notification, des Activities, etc.


4. Envoi de diffusions

Bon, plus haut, nous recevions tous des diffusions système. Le système envoie et nous recevons. On ne peut pas toujours être aussi passifs ; il faut prendre l'initiative, non ? De plus, demain c'est la fête de Qixi (la Saint-Valentin chinoise). Programmeurs, profitez-en bien et essayez de trouver un partenaire, haha ! Bon, revenons aux diffusions. Nous allons envoyer des diffusions de notre propre initiative ! Voyons comment le mettre en œuvre.

Comment envoyer :Avant d'envoyer une diffusion, vous devez d'abord définir un récepteur, déterminer la cible, puis faire votre déclaration ! ~(●'◡'●)~

Exemple de code : (diffusion standard)

MyBroadcastReceiver.java

public class MyBroadcastReceiver extends BroadcastReceiver {
    private final String ACTION_BOOT = "com.example.broadcasttest.MY_BROADCAST";
    @Override
    public void onReceive(Context context, Intent intent) {
        if(ACTION_BOOT.equals(intent.getAction()))
        Toast.makeText(context, "收到告白啦~",Toast.LENGTH_SHORT).show();
    }
}

Ensuite, enregistrez-le dans AndroidManifest.xml et écrivez l'Intent-filter :

<receiver android:name=".MyBroadcastReceiver">
    <intent-filter>
        <action android:name="com.example.broadcasttest.MY_BROADCAST"/>
    </intent-filter>
</receiver>

Bon, ensuite exécutons le projet de programme ci-dessus, puis fermons-le. Ensuite, nous créons un nouveau projet, et dans ce projet nous réalisons l'envoi de la diffusion. Créez Demo2, la mise en page n'est qu'un simple bouton, puis réalisez l'envoi de la diffusion dans MainActivity :

MainActivity.java :

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn_send = (Button) findViewById(R.id.btn_send);
        btn_send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendBroadcast(new Intent("com.example.broadcasttest.MY_BROADCAST"));
            }
        });
    }
}

Héhé, regardez la capture d'écran d'exécution :


Résumé de cette section :

Très bien, l'utilisation simple de BroadcastReceiver est aussi simple que cela. Cependant, ce que nous avons utilisé ici, c'étaient uniquement des diffusions globales, ce qui signifie que d'autres applications peuvent également recevoir nos diffusions. Cela peut causer des problèmes de sécurité, mais ce n'est pas grave. Dans la section suivante, nous vous apprendrons comment utiliser les diffusions locales, comment installer des applications sur la carte SD après Android 4.3, et comment écouter le démarrage du système. Bon, c'est tout pour cette section, merci~