Composant Android: BroadcastReceiver

Composant Android: BroadcastReceiver

944
0

Chaque fois que vous voulez en savoir plus sur les événements système, vous devez implémenter et enregistrer un BroadcastReceiver. Dès lors, votre récepteur reçoit des notifications chaque fois que l’événement système pour lequel il est enregistré se produit.
BroadcastReceivers est l’un des quatre composants standard d’Android.

A quoi servent BroadcastReceivers?

Le fait qu’Android vous informe sur les événements système, offre la possibilité de créer de belles applications ainsi que des ajouts conviviaux aux applications existantes.

Trois exemples pourraient illustrer ceci:

1. App2SD utilise l’événement ACTION_PACKAGE_ADDED pour être averti chaque fois qu’un nouveau paquet a été installé ou qu’un paquet existant a été mis à jour. Si ce package peut être déplacé vers la carte SD, l’application ajoute une notification afin que l’utilisateur en soit informé et puisse déplacer facilement l’application.

2. Batterie Widget Reborn utilise l’événement ACTION_BOOT_COMPLETED pour démarrer immédiatement et afficher l’icône de notification contenant le niveau de charge actuel de votre appareil.

3. AirDroid utilise l’événement CONNECTIVITY_ACTION pour que son widget affiche les connexions WIFI établies. Si votre appareil dispose d’une connexion WIFI établie, le widget change d’état et en un clic sur le widget, l’utilisateur voit les détails de connexion d’AirDroid.

Compte tenu de la grande quantité d’événements de diffusion, les possibilités sont infinies. C’est à votre imagination de faire usage des événements de diffusion de manière à soutenir la tâche principale de votre application.

Implémenter le BroadcastReceiver

Lors de l’implémentation d’un récepteur de diffusion, vous devez effectuer deux étapes:

  • Vous devez créer une sous-classe de BroadcastReceiver d’Android

  • Vous devez implémenter la méthode onReceive ()

Je détaillerai toutes les étapes nécessaires dans les sections suivantes.

Créer une sous-classe de BroadcastReceiver

Chaque récepteur de diffusion doit sous-classer BroadcastReceiver d’Android. Cette classe de base est abstraite, ce qui signifie que vous devez fournir une implémentation de la méthode abstraite onReceive (). Je vais couvrir cette méthode dans la section suivante.

Pour l’instant je crée simplement une implémentation vide pour que la classe compile – mais elle ne fait rien d’utile pour le moment:

package com.grokkingandroid.connectivity;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class ConnectivityChangeReceiver 
      extends BroadcastReceiver {

   @Override
   public void onReceive
         (Context context, Intent intent) {
      // react to the event
   }

}

Implémenter la méthode onReceive ()

Android appelle la méthode onReceive () sur tous les récepteurs de diffusion enregistrés chaque fois que l’événement se produit. Dites que vous voulez être averti lorsque le niveau de la batterie devient bas. Dans ce cas, vous pouvez enregistrer votre récepteur à l’événement Intent.ACTION_BATTERY_LOW. Maintenant, dès que le niveau de la batterie tombe en dessous d’un seuil défini, votre méthode onReceive () sera appelée.
Cette méthode prend deux arguments:

Les arguments de la méthode onReceive ()

Argument signification
context L’objet Contexte que vous pouvez utiliser pour accéder à des informations supplémentaires ou pour démarrer des services ou des activité
intent L’objet Intent avec l’action que vous avez utilisée pour enregistrer votre récepteur. Cet objet contient des informations supplémentaires que vous pouvez utiliser dans votre implémentation.

 

L’objet Intent transmis à la méthode onReceive () contient souvent des informations supplémentaires que vous pouvez utiliser pour en savoir plus sur l’événement. Pour un exemple, consultez mon article sur l’événement de changement de connectivité.
L’objet Context est nécessaire si vous voulez démarrer une activité ou un service.

Les services sont probablement plus courants avec les récepteurs de diffusion car il est fort probable que votre utilisateur n’utilise pas votre application de manière active au moment où l’événement se produit. Les services méritent un article de blog par eux-mêmes. Ainsi je vous montre seulement comment démarrer un service depuis votre récepteur:

context.startService
      (new Intent(context, YourService.class));

Evénements à l’échelle du système pour lesquels vous pouvez vous inscrire

De nombreux événements système sont définis en tant que champs statiques finaux de la classe Intent. De plus, tout au long de l’API, il existe de nombreuses autres classes qui proposent des événements de diffusion spécifiques. Quelques exemples sont BluetoothDevice ou TextToSpeech.Engine et presque toutes les classes Manager comme UsbManager ou AudioManager. Android offre vraiment beaucoup d’événements que nous pouvons utiliser dans nos applications.
La liste suivante est seulement un petit échantillon de tous les événements disponibles.

Exemples d’événements système

événements

Usage
Intent.ACTION_BATTERY_LOW Le niveau de la batterie est tombé en dessous d’un seuil
Intent.ACTION_BATTERY_OKAY Le niveau de la batterie a de nouveau augmenté
Intent.ACTION_BOOT_COMPLETED Android est opérationnel
Intent.ACTION_DEVICE_STORAGE_LOW L’espace de stockage sur l’appareil devient limité
Intent.ACTION_DEVICE_STORAGE_OK La situation de stockage s’est améliorée à nouveau
Intent.ACTION_HEADSET_PLUG Un casque a été branché ou un casque précédemment branché a été retiré
Intent.ACTION_LOCALE_CHANGED L’utilisateur a changé la langue de l’appareil
Intent.ACTION_MY_PACKAGE_REPLACED Votre application a été mise à jour
Intent.ACTION_PACKAGE_ADDED Une nouvelle application a été installée
Intent.ACTION_POWER_CONNECTED L’appareil a été branché
Intent.ACTION_POWER_DISCONNECTED L’appareil a été déconnecté à nouveau
KeyChain.ACTION_STORAGE_CHANGED Le fichier de clés a été modifié
BluetoothDevice.ACTION_ACL_CONNECTED Une connexion Bluetooth ACL a été établie
AudioManager.ACTION_AUDIO_BECOMING_NOISY Le haut-parleur audio interne est sur le point d’être utilisé à la place d’autres moyens de sortie (comme un casque)

Enregistrement d’un BroadcastReceiver dans le fichier manifeste

Comme d’habitude, les récepteurs de diffusion peuvent être configurés dans le fichier manifeste AndroidManifest.xml. Un BroadcastReceiver configuré de cette manière est appelé statiquement enregistré.

Vous pouvez enregistrer votre récepteur dans le fichier manifeste en utilisant le <receiver >; élément:

<receiver 
      android:name=".BootCompletedReceiver" 
      android:enabled="true"
      android:exported="true">
   <intent-filter>
      <action android:name="android.intent.action.BOOT_COMPLETED" />
   </intent-filter>
</receiver>

L’élément imbriqué <intent-filter> est utilisé pour spécifier l’événement auquel le récepteur doit réagir.
Vous devez vous référer à la documentation pour trouver la valeur correcte à mettre ici. Comme mentionné ci-dessus, Android définit les champs statiques finaux pour les actions de diffusion et l’API indique toujours la valeur de cette constante. Dans le fichier manifeste, vous devez utiliser la valeur.
Si vous enregistrez votre récepteur dans le fichier manifeste, votre récepteur sera appelé chaque fois que l’événement se produit. Cela pourrait être ce que vous voulez – ou cela pourrait être trop souvent. Cela dépend du type d’événement et de ce dont vous avez besoin. Voir plus à ce sujet ci-dessous dans la section « Quand utiliser quelle méthode enregistrer ».
Dès que la méthode onReceive () est terminée, votre BroadcastReceiver se termine.

Enregistrez votre BroadcastReceiver par programme

Vous pouvez également enregistrer votre implémentation BroadcastReceiver de manière dynamique dans votre code. Vous avez juste besoin d’appeler la méthode registerReceiver () sur votre objet Context.
La méthode registerReceiver () prend deux paramètres:

Les arguments de la méthode registerReceiver

Argument Siginfication
receiver Le BroadcastReceiver que vous voulez enregistrer
filter L’objet IntentFilter qui spécifie quel événement votre récepteur doit écouter.

 

Lorsque vous enregistrez votre récepteur de cette manière, il reste actif pendant toute la durée de vie du composant et Android envoie des événements à ce récepteur jusqu’à ce que le composant de création lui-même soit détruit.
C’est votre tâche de gérer le cycle de vie correctement. Ainsi, lorsque vous ajoutez dynamiquement un récepteur, prenez soin de désinscrire le même destinataire dans la méthode onPause () de votre Activity!
Je suggère d’enregistrer le récepteur dans la méthode onResume () de votre Activity et de l’annuler dans votre méthode onPause ():

@Override
protected void onPause() {
   unregisterReceiver(mReceiver);
   super.onPause();
}

@Override
protected void onResume() {
   this.mReceiver = new ConnectivityChangeReceiver();
   registerReceiver(
         this.mReceiver, 
         new IntentFilter(
               ConnectivityManager.CONNECTIVITY_ACTION));
   super.onResume();
}

Quand utiliser la méthode pour s’enregistrer

La méthode à utiliser pour enregistrer votre BroadcastReceiver dépend de ce que fait votre application avec l’événement système. Je pense qu’il y a essentiellement deux raisons pour lesquelles votre application veut connaître les événements à l’échelle du système:

Votre application offre une sorte de service autour de ces événements
Votre application veut réagir gracieusement aux changements d’état

Les exemples de la première catégorie sont les applications qui doivent fonctionner dès que le périphérique est démarré ou qui doivent démarrer une sorte de travail lorsqu’une application est installée. Battery Widget Pro ou App2SD sont de bons exemples pour ce genre d’applications. Pour ce type, vous devez enregistrer le BroadcastReceiver dans le fichier manifeste.

Les exemples de la deuxième catégorie sont les événements qui signalent une modification des circonstances sur lesquelles votre application peut s’appuyer. Dites que votre application dépend d’une connexion Bluetooth établie. Vous devez réagir à un changement d’état – mais seulement lorsque votre application est active. Dans ce cas, il n’y a pas besoin d’un récepteur de radiodiffusion statiquement enregistré. Un enregistré dynamiquement serait plus raisonnable.

Il y a aussi quelques événements auxquels vous n’êtes même pas autorisé à vous inscrire statiquement. Un exemple pour cela est l’événement Intent.ACTION_TIME_TICK qui est diffusé toutes les minutes. Ce qui est une sage décision car un récepteur statique viderait inutilement la batterie.

Éviter les emplois durables

Vous devriez éviter toute tâche de longue durée dans votre BroadcastReceiver. Les récepteurs enregistrés statiquement et dynamiquement sont traités légèrement différemment. Mais dans les deux cas, vous ne devez effectuer que des tâches mineures dans le récepteur lui-même. Pour les tâches plus longues, vous devez démarrer un service depuis votre récepteur.
Les récepteurs enregistrés dynamiquement sont appelés sur le thread d’interface utilisateur. Cela signifie que vos récepteurs bloquent toute manipulation de l’interface utilisateur et donc la méthode onReceive () doit être aussi rapide que possible. Une erreur « Application ne répondant pas » est le pire des cas, mais même sans les utilisateurs peuvent être frustrés par une application apparemment lente.

Autorisations

Pour certains événements, vous devez disposer des autorisations appropriées. Par exemple, votre application nécessite l’autorisation « android.permission.RECEIVE_BOOT_COMPLETED » si vous souhaitez être averti de l’événement Intent.ACTION_BOOT_COMPLETED.

Pour configurer cette autorisation, ajoutez la ligne suivante à votre fichier manifeste:

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

Pour la plupart des événements, aucune permission n’est requise. Vérifiez l’API pour l’événement approprié pour voir si vous devez configurer une autorisation dans votre fichier manifeste.

Nike Sneakers | Air Jordan 1 Παπούτσια & Ρούχα , Προσφορές, Στοκ, Φθηνά , Gov Sport

NO COMMENTS

LEAVE A REPLY