Android - Récepteurs de diffusion

Broadcast Receivers répondre simplement aux messages diffusés à partir d'autres applications ou du système lui-même. Ces messages sont parfois appelés événements ou intentions. Par exemple, les applications peuvent également lancer des diffusions pour informer les autres applications que certaines données ont été téléchargées sur l'appareil et qu'elles sont disponibles pour qu'elles puissent être utilisées, c'est donc le récepteur de diffusion qui interceptera cette communication et lancera l'action appropriée.

Il y a deux étapes importantes suivantes pour que BroadcastReceiver fonctionne pour les intentions diffusées par le système -

  • Création du récepteur de diffusion.

  • Enregistrement du récepteur de diffusion

Il y a une étape supplémentaire dans le cas où vous allez implémenter vos intentions personnalisées, vous devrez créer et diffuser ces intentions.

Création du récepteur de diffusion

Un récepteur de diffusion est implémenté en tant que sous-classe de BroadcastReceiver classe et surcharger la méthode onReceive () où chaque message est reçu en tant que Intent paramètre d'objet.

public class MyReceiver extends BroadcastReceiver {
   @Override
   public void onReceive(Context context, Intent intent) {
      Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
   }
}

Enregistrement du récepteur de diffusion

Une application écoute des intentions de diffusion spécifiques en enregistrant un récepteur de diffusion dans le fichier AndroidManifest.xml . Considérez que nous allons enregistrer MyReceiver pour l'événement généré par le système ACTION_BOOT_COMPLETED qui est déclenché par le système une fois que le système Android a terminé le processus de démarrage.

Récepteur de diffusion

<application
   android:icon="@drawable/ic_launcher"
   android:label="@string/app_name"
   android:theme="@style/AppTheme" >
   <receiver android:name="MyReceiver">
   
      <intent-filter>
         <action android:name="android.intent.action.BOOT_COMPLETED">
         </action>
      </intent-filter>
   
   </receiver>
</application>

Désormais, chaque fois que votre appareil Android est démarré, il sera intercepté par BroadcastReceiver MyReceiver et la logique implémentée dans onReceive () sera exécutée.

Il existe plusieurs événements générés par le système définis comme champs statiques finaux dans le Intentclasse. Le tableau suivant répertorie quelques événements système importants.

Sr.Non Constante d'événement et description
1

android.intent.action.BATTERY_CHANGED

Diffusion collante contenant l'état de charge, le niveau et d'autres informations sur la batterie.

2

android.intent.action.BATTERY_LOW

Indique une condition de batterie faible sur l'appareil.

3

android.intent.action.BATTERY_OKAY

Indique que la batterie est maintenant correcte après avoir été faible.

4

android.intent.action.BOOT_COMPLETED

Ceci est diffusé une fois, une fois que le système a fini de démarrer.

5

android.intent.action.BUG_REPORT

Afficher l'activité pour signaler un bogue.

6

android.intent.action.CALL

Effectuer un appel à une personne spécifiée par les données.

sept

android.intent.action.CALL_BUTTON

L'utilisateur a appuyé sur le bouton «appel» pour accéder au composeur ou à une autre interface utilisateur appropriée pour passer un appel.

8

android.intent.action.DATE_CHANGED

La date a changé.

9

android.intent.action.REBOOT

Faites redémarrer l'appareil.

Diffusion d'intentions personnalisées

Si vous voulez que votre application elle-même génère et envoie des intentions personnalisées, vous devrez créer et envoyer ces intentions en utilisant la méthode sendBroadcast () dans votre classe d'activité. Si vous utilisez la méthode sendStickyBroadcast (Intent) , l'intention eststicky, ce qui signifie que l' intention que vous envoyez reste une fois la diffusion terminée.

public void broadcastIntent(View view) {
   Intent intent = new Intent();
   intent.setAction("com.tutorialspoint.CUSTOM_INTENT");
   sendBroadcast(intent);
}

Cette intention com.tutorialspoint.CUSTOM_INTENT peut également être enregistrée de la même manière que nous avons enregistré l'intention générée par le système.

<application
   android:icon="@drawable/ic_launcher"
   android:label="@string/app_name"
   android:theme="@style/AppTheme" >
   <receiver android:name="MyReceiver">
   
      <intent-filter>
         <action android:name="com.tutorialspoint.CUSTOM_INTENT">
         </action>
      </intent-filter>
   
   </receiver>
</application>

Exemple

Cet exemple vous explique comment créer BroadcastReceiver pour intercepter l'intention personnalisée. Une fois que vous êtes familiarisé avec l'intention personnalisée, vous pouvez programmer votre application pour intercepter les intentions générées par le système. Alors suivons les étapes suivantes pour modifier l'application Android que nous avons créée dans le chapitre Exemple de Hello World -

Étape La description
1 Vous utiliserez Android Studio pour créer une application Android et la nommerez My Application sous un package com.example.tutorialspoint7.myapplication comme expliqué dans le chapitre Exemple de Hello World .
2 Modifiez le fichier d'activité principal MainActivity.java pour ajouter la méthode broadcastIntent () .
3 Créez un nouveau fichier java appelé MyReceiver.java sous le package com.example.tutorialspoint7.myapplication pour définir un BroadcastReceiver.
4 Une application peut gérer une ou plusieurs intentions personnalisées et système sans aucune restriction. Chaque intention que vous souhaitez intercepter doit être enregistrée dans votre fichier AndroidManifest.xml à l'aide de la balise <receiver ... />
5 Modifiez le contenu par défaut du fichier res / layout / activity_main.xml pour inclure un bouton pour diffuser l'intention.
6 Pas besoin de modifier le fichier string, Android Studio s'occupe du fichier string.xml.
sept Exécutez l'application pour lancer l'émulateur Android et vérifiez le résultat des modifications effectuées dans l'application.

Voici le contenu du fichier d'activité principal modifié MainActivity.java. Ce fichier peut inclure chacune des méthodes fondamentales du cycle de vie. Nous avons ajouté la méthode broadcastIntent () pour diffuser un intent personnalisé.

package com.example.tutorialspoint7.myapplication;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {

   /** Called when the activity is first created. */
   @Override
   
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
   }


   // broadcast a custom intent.
      
   public void broadcastIntent(View view){
      Intent intent = new Intent();
      intent.setAction("com.tutorialspoint.CUSTOM_INTENT"); sendBroadcast(intent);
   }
}

Voici le contenu de MyReceiver.java:

package com.example.tutorialspoint7.myapplication;

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

/**
 * Created by TutorialsPoint7 on 8/23/2016.
 */
public class MyReceiver extends BroadcastReceiver{
   @Override
   public void onReceive(Context context, Intent intent) {
      Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
   }
}

Voici le contenu modifié du fichier AndroidManifest.xml . Ici, nous avons ajouté la balise <receiver ... /> pour inclure notre service:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.tutorialspoint7.myapplication">

   <application
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:label="@string/app_name"
      android:supportsRtl="true"
      android:theme="@style/AppTheme">
		
      <activity android:name=".MainActivity">
         <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
         </intent-filter>
      </activity>
   
      <receiver android:name="MyReceiver">
         <intent-filter>
            <action android:name="com.tutorialspoint.CUSTOM_INTENT">
            </action>
         </intent-filter>

      </receiver>
   </application>

</manifest>

Voici le contenu de res/layout/activity_main.xml fichier pour inclure un bouton pour diffuser notre intention personnalisée -

<RelativeLayout 
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools" 
   android:layout_width="match_parent"
   android:layout_height="match_parent" 
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   android:paddingBottom="@dimen/activity_vertical_margin" 
   tools:context=".MainActivity">
   
   <TextView
      android:id="@+id/textView1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Example of Broadcast"
      android:layout_alignParentTop="true"
      android:layout_centerHorizontal="true"
      android:textSize="30dp" />
      
   <TextView
      android:id="@+id/textView2"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Tutorials point "
      android:textColor="#ff87ff09"
      android:textSize="30dp"
      android:layout_above="@+id/imageButton"
      android:layout_centerHorizontal="true"
      android:layout_marginBottom="40dp" />
      
   <ImageButton
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/imageButton"
      android:src="@drawable/abc"
      android:layout_centerVertical="true"
      android:layout_centerHorizontal="true" />
      
   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/button2"
      android:text="Broadcast Intent"
      android:onClick="broadcastIntent"
      android:layout_below="@+id/imageButton"
      android:layout_centerHorizontal="true" />

</RelativeLayout>

Essayons d'exécuter notre modifié Hello World!application que nous venons de modifier. Je suppose que vous avez créé votreAVDlors de la configuration de l'environnement. Pour exécuter l'application à partir du studio Android, ouvrez l'un des fichiers d'activité de votre projet et cliquez sur l' icône Exécuter dans la barre d'outils. Android Studio installe l'application sur votre AVD et la démarre et si tout va bien avec votre configuration et votre application, elle s'affichera à la suite de la fenêtre de l'émulateur -

Maintenant, pour diffuser notre intention personnalisée, cliquons sur Broadcast Intentbouton, cela diffusera notre intention personnalisée "com.tutorialspoint.CUSTOM_INTENT" qui sera interceptée par notre BroadcastReceiver enregistré, c'est-à-dire MyReceiver et selon notre logique implémentée, un toast apparaîtra au bas du simulateur comme suit -

Vous pouvez essayer d'implémenter d'autres BroadcastReceiver pour intercepter les intentions générées par le système telles que le démarrage du système, la date de changement, la batterie faible, etc.