BroadcastReceiverPao Ding Jie Niu


Introduction à cette section :

Dans la section précédente, nous avions déjà une compréhension préliminaire de BroadcastReceiver et connaissions les deux types de diffusion : standard et ordonnée. Enregistrez les récepteurs de diffusion de manière dynamique ou statique, écoutez les diffusions du système et envoyez-les vous-même ! Nos besoins fondamentaux ont été satisfaits ~ Mais les émissions écrites ci-dessus sont toutes des émissions mondiales ! Cela signifie également que les émissions envoyées par notre APP seront reçues par d'autres APP. Ou bien les diffusions envoyées par d'autres applications seront également reçues par notre application, ce qui peut facilement causer des problèmes de sécurité ! et Android nous fournit un mécanisme de diffusion locale. Les diffusions émises à l'aide de ce mécanisme ne seront propagées qu'au sein de l'APP, et Les récepteurs de diffusion ne peuvent recevoir que les diffusions envoyées par cette application !


1. Diffusion locale

1) Utilisation de base :

1.png

PS : La diffusion locale ne peut pas L'acceptation via l'enregistrement statique est plus efficace que la diffusion globale du système

2) Notes :

2.png

3) Exemple de code (ailleurs, connectez-vous pour lancer le utilisateur hors ligne) :

Comme WeChat, si WeChat est en cours d'exécution, si nous nous reconnectons à notre compte avec un autre téléphone mobile, le précédent rappellera le compte Connectez-vous à un autre terminal comme celui-ci, puis fermez toutes les activités que nous avons ouvertes, puis revenez à la page de connexion comme ceci~
Écrivons un exemple simple ci-dessous :

Rendu d'opération :

3.gif

Mise en œuvre du code :

Étape 1 : Préparer un ActivityCollector qui ferme toutes les activités. Celui fourni par l'activité précédente a été utilisé ici

ActivityCollector.java

!
ActivityCollector de classe publique {
    Liste statique privée <Activité> activités = new ArrayList<Activity>();
    public static void addActivity(Activity activity) {
        activities.add(activity);
    }
    public static void removeActivity(Activity activity) {
>           activité .finish();
            }
        }
    }
}



Étape 2
:先写要给简单的BaseActivity,用来继donc

classe publique BaseActivity étend AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
> 🎜 >    }
}

LoginActivity.java :


classe publique LoginActivity étend BaseActivity implémente View.OnClickListener{


    private SharedPreferences pref;
    private SharedPreferences.Editor editor;

    private EditText ed it_user;
    private EditText edit_pawd;
    private Button btn_login;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate( saveInstanceState);
        setContentView(R .layout.activity_login);
        pref = PreferenceManager.getDefaultSharedPreferences(this);

        bindViews();
    }

    private void bindViews() {
        ed it_user = ( EditText) findViewById(R.id.edit_user);
        edit_pawd = (EditText) findViewById(R.id.edit_pawd);
        btn_login = (Bouton) findViewById(R.id.btn_login);
        btn_login. setOnClickListener(this);
    }

    @Override
    protected void onStart() {
        super.onStart();
        if(!pref.getString("user"," ").equals("")){
            edit_user.setText(pref.getString("user",""));
            edit_pawd.setText(pref.getString("pawd",""));
         Faut d = edit_pawd .getText().toString();
        if(user.equals("123")&&pawd.equals("123")){
            editor = pref.edit();
            editor.putString( "utilisateur", utilisateur);
editor.putString("pawd", Pawd);
     editor.commit();
      Intent intent = new Intent(LoginActivity.this, MainActivity.class
    startActivity(intent);
Toast); .makeText(LoginActivity.this, "Oh, j'avais raison~",Toast.LENGTH_SHORT).show();
finish();
}else{
Toast.makeText(LoginActivity.this, " C'est si simple à calculer, où est ton cerveau ?",Toast.LENGTH_SHORT).show();
                                                                                                                                                             Terminez l'opération de boîte de dialogue contextuelle dans onReceive et démarrez la page de connexion : MyBcReceiver.java

public class MyBcReceiver extends BroadcastReceiver {
@Override
public void onReceive (contexte de contexte final, intention d'intention) {
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context);
dialogBuilder.setTitle(" Attention :");
dialogBuilder.setMessage("Votre compte est connecté ailleurs, veuillez vous reconnecter~");
dialogBuilder.setCancelable(false);
dialogBuilder.setPositiveButton("OK",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
                 ActivityCollector.finishAll();                                          intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        context.startActivity(intent);
                    }
                });
    );
        AlertDialog alertDialog = dialogBuilder.create();
        alertDialog.getWindow(). setType(
                WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
        alertDialog.show();
    }
}
<🎜>


N'oubliez pas d'ajouter l'autorisation de boîte de dialogue système dans AndroidManifest.xml : <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

Étape 4 : Dans MainActivity, instanciez localBroadcastManager, utilisez-le pour effectuer les opérations associées et détruisez-le en plus Faites attention à désinscrireReceiver !

MainActivity.java

classe publique MainActivity étend BaseActivity {

    private MyBcReceiver localReceiver;
    private LocalBroadcastManager localBroadcastManager;
    private IntentFilter intentFilter;

    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        localBroadcastManager = LocalBroadcastManager.getInstance(this);

        //初始化广播接收者,设置过滤器
        localReceiver = new MyBcReceiver();
        intentFilter = new IntentFilter();
        intentFilter.addAction("com.jay.mybcreceiver.LOGIN_OTHER");
        localBroadcastManager.registerReceiver( localReceiver, intentFilter);

        Button btn_send = (Bouton) findViewById(R.id.btn_send);
        btn_send.setOnClickListener(new View.OnClickListener() {
            @Override
            vide public onClick(View v) {
                Intent intent = new Intent("com.jay.mybcreceiver.LOGIN_OTHER");
                localBroadcastManager.sendBroadcast(intent);
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        localBroadcastManager.unregisterReceiver(localReceiver);
    }
}

D'accord, c'est aussi simple que cela, n'oubliez pas d'enregistrer l'activité~


2. Résoudre le problème de surveillance de la diffusion de démarrage sur Android 4.3 et supérieur :

Activé. Version Android 4.3 et supérieure, nous permettant d'installer l'application sur la SD, on sait tous que le système démarre La carte SD n'est chargée qu'après un court intervalle, notre application risque donc de ne pas être en mesure de surveiller cette diffusion ! Nous devons donc surveiller à la fois la diffusion de démarrage et la diffusion de montage de la carte SD !

De plus, certains téléphones mobiles peuvent ne pas avoir de carte SD, nous ne pouvons donc pas écrire ces deux moniteurs de diffusion dans le même filtre Internet. Au lieu de cela, il doit être écrit en deux. Le code de configuration est le suivant : name="android.intent.action.BOOT_COMPLETED"/>

  </intent-filter>
  <intent-filter>
  <action android:name="ANDROID.INTENT.ACTION. MEDIA_MOUNTED"/>
  <action android:name="ANDROID.INTENT.ACTION.MEDIA_UNMOUNTED"/>
  <data android :scheme="file"/>
</intent -filter>
</receiver>


3. Récapitulatif des diffusions système couramment utilisées :

Enfin, permettez-moi de vous fournir quelques diffusions système que nous pouvons habituellement utiliser :

Intent.ACTION_AIRPLANE_MODE_CHANGED;
//Diffusion lors de la désactivation ou de l'activation du mode avion

<strong>Intent.ACTION_BATTERY_CHANGED;
//État de charge ou événement d'alimentation de la batterie Changement
//L'état de charge et le niveau de charge du changement de batterie. Cette diffusion ne peut pas être reçue via la déclaration de l'établissement. Elle ne peut être enregistrée que via Context.registerReceiver()

<strong>Intent. ACTION_BATTERY_LOW;
// Indique que la batterie est faible

<strong>Intent.ACTION_BATTERY_OKAY;
//Indique que la batterie est suffisante, c'est-à-dire qu'une diffusion sera émise lorsque la puissance de la batterie passe de faible à pleine.

Intent.ACTION_BOOT_COMPLETED;
//Une fois le démarrage du système terminé, cette action est diffusée une fois (une seule fois).

Intent.ACTION_CAMERA_BUTTON;
//Diffusion lorsque le bouton de l'appareil photo (bouton matériel) est enfoncé lors de la prise de photos

Intent.ACTION_CLOSE_SYSTEM_DIALOGS;
//Verrouillage lorsque l'écran expire Lorsque l'utilisateur appuie sur le bouton d'alimentation, appuie longuement ou brièvement (que la boîte de dialogue s'affiche ou non) et verrouille l'écran, le système Android diffusera ce message d'action

Intent.ACTION_CONFIGURATION_CHANGED;
//Diffusion émise lorsque les paramètres actuels de l'appareil sont modifiés (y compris les modifications : langue de l'interface, orientation de l'appareil, etc., veuillez vous référer à Configuration.java)

Intent.ACTION_DATE_CHANGED;
//Lorsque le changements de date de l'appareil Envoyer cette diffusion

Intent.ACTION_DEVICE_STORAGE_LOW;
//Diffusion envoyée lorsque la mémoire de l'appareil est insuffisante. Cette diffusion ne peut être utilisée que par le système et n'est pas disponible pour d'autres applications ?

Intent.ACTION_DEVICE_STORAGE_OK;
//Diffusion envoyée lorsque la mémoire de l'appareil passe d'insuffisante à suffisante. Cette diffusion ne peut être utilisée que par le système et ne peut pas être utilisée par d'autres applications ?

Intent.ACTION_DOCK_EVENT;
//
//L'endroit où cette diffusion est émise frameworksbaseservicesjavacomandroidserverDockObserver.java

Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE;
////Après le mobile L'APP est terminée, la diffusion est émise (le mobile fait référence à : APP2SD)

Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE;
//Lorsque l'APP est déplacée, la diffusion est émise (le mobile fait référence à : APP2SD)

Intent.ACTION_GTALK_SERVICE_CONNECTED;
//Diffuser lorsque Gtalk a établi une connexion

Intent.ACTION_GTALK_SERVICE_DISCONNECTED;
//Diffuser lorsque Gtalk s'est déconnecté

Intent.ACTION_HEADSET_PLUG;
/ /Diffusion émise lors de l'insertion d'un casque dans la prise casque

Intent.ACTION_INPUT_METHOD_CHANGED;
//Diffusion émise lors du changement de méthode de saisie

Intent.ACTION_LOCALE_CHANGED;
//L'appareil est actuellement diffusé lorsque les paramètres régionaux ont changé

Intent.ACTION_MANAGE_PACKAGE_STORAGE;
//

Intent.ACTION_MEDIA_BAD_REMOVAL;
//La carte SD n'a pas été retirée correctement (la carte SD a été retirée correctement Méthode : Paramètres - -Carte SD et mémoire de l'appareil--Démontez la carte SD), mais la diffusion est envoyée lorsque la carte SD a été retirée
//Diffusion : Le support d'extension (carte d'extension) a été retiré de l'emplacement pour carte SD, mais le point de montage (point de montage) n'a pas été libéré (démonter)

Intent.ACTION_MEDIA_BUTTON;
//Diffusion lorsque le bouton "Bouton Média" est enfoncé, s'il existe un bouton "Bouton Média" (bouton matériel)

Intent.ACTION_MEDIA_CHECKING;
//Lors de l'insertion d'un périphérique de stockage externe, tel que une carte SD , ​​le système vérifiera la carte SD, la diffusion envoyée à ce moment-là ?
Intent.ACTION_MEDIA_EJECT;
//La diffusion envoyée par le périphérique de stockage de masse externe (tel qu'une carte SD ou un disque dur mobile ) a été débranché, que ce soit correct ou non. Cette diffusion sera émise même lors de la désinstallation ?
//Diffusion : L'utilisateur souhaite retirer le support d'extension (débrancher la carte d'extension).
Intent.ACTION_MEDIA_MOUNTED;
//Diffusion lorsque la carte SD est insérée et correctement installée (reconnue)
//Diffusion : Le support étendu est inséré et a été monté.
Intent.ACTION_MEDIA_NOFS;
//
Intent.ACTION_MEDIA_REMOVED;
//Le périphérique de stockage externe a été supprimé. Cette diffusion sera-t-elle émise, qu'il soit ou non désinstallé correctement ?
// Diffusion : Médias étendus supprimés.
Intent.ACTION_MEDIA_SCANNER_FINISHED;
//Broadcast : Un répertoire de médias a été analysé
Intent.ACTION_MEDIA_SCANNER_SCAN_FILE;
//
Intent.ACTION_MEDIA_SCANNER_STARTED;
//Broadcast : Démarrer l'analyse du média Un répertoire de

Intent.ACTION_MEDIA_SHARED;
// Broadcast : Le support étendu est démonté car il a été partagé en tant que stockage de masse USB.
Intent.ACTION_MEDIA_UNMOUNTABLE;
//
Intent.ACTION_MEDIA_UNMOUNTED
// Broadcast : Le support étendu existe, mais n'a pas été monté (mount).
Intent.ACTION_NEW_OUTGOING_CALL;

Intent.ACTION_PACKAGE_ADDED;
//Après l'installation réussie de l'APK
//Broadcast : Un nouveau package d'application est installé sur l'appareil.
//Un nouveau package d'application a été installé sur l'appareil, les données incluent le nom du package (le dernier package installé ne peut pas recevoir cette diffusion)
Intent.ACTION_PACKAGE_CHANGED;
//Un package d'application existant a été modifié, y compris le nom du package
Intent.ACTION_PACKAGE_DATA_CLEARED
//Diffusion émise lors de l'effacement des données d'une application (lors de la sélection d'une application dans Paramètres - Gestion des applications - puis en cliquant sur Effacer les données ?)
/ /L'utilisateur a effacé les données d'un package, y compris le nom du package (le programme du package d'effacement ne peut pas recevoir cette diffusion)

Intent.ACTION_PACKAGE_INSTALL;
//Une diffusion est envoyée lorsqu'un téléchargement est déclenché et l'installation est terminée, comme le téléchargement d'applications sur le marché électronique ?
//
Intent.ACTION_PACKAGE_REMOVED;
//Diffusion émise après la suppression réussie d'un APK
//Un package d'application existant a été supprimé de l'appareil, y compris le nom du package (le programme du package en cours d'installation ne peut pas recevoir cette diffusion)

Intent.ACTION_PACKAGE_REPLACED;
//Diffusion émise lors du remplacement d'un package d'installation existant (que l'application actuellement installée soit plus récente ou plus ancienne que la précédente), cette diffusion sera-t-elle émis ? )
Intent.ACTION_PACKAGE_RESSTARTED;
//L'utilisateur redémarre un package, tous les processus du package seront supprimés et tous les états d'exécution qui lui sont associés doivent être supprimés, y compris le nom du package (le programme de redémarrage du package impossible de recevoir cette diffusion)
Intent.ACTION_POWER_CONNECTED;
//Diffusion émise lorsque l'alimentation externe est branchée
Intent.ACTION_POWER_DISCONNECTED;
//Diffusion émise lorsque l'alimentation externe est déconnectée
Intent.ACTION_PROVIDER_CHANGED;
//

Intent.ACTION_REBOOT;
//Diffusion au redémarrage de l'appareil

Intent.ACTION_SCREEN_OFF;
//Diffusion après l'extinction de l'écran

Intent.ACTION_SCREEN_ON;
// Diffusion après l'ouverture de l'écran

Intent.ACTION_SHUTDOWN;
//Diffusion lorsque le système est éteint

Intent.ACTION_TIMEZONE_CHANGED;
//Diffusion lorsque le fuseau horaire changes

Intent.ACTION_TIME_CHANGED;
//Diffusion émise lorsque l'heure est réglée

Intent.ACTION_TIME_TICK;
//Diffusion : L'heure actuelle a changé (délai normal) .
//L'heure actuelle change et est envoyée toutes les minutes. Elle ne peut pas être reçue via la déclaration du composant. Elle ne peut être enregistrée que via la méthode Context.registerReceiver()

Intent.ACTION_UID_REMOVED;
. //Un identifiant utilisateur a été Supprimer les diffusions du système
//

Intent.ACTION_UMS_CONNECTED;
//Diffusions envoyées lorsque l'appareil est entré dans l'état de stockage de masse USB ?

Intent.ACTION_UMS_DISCONNECTED;
//Diffusion lorsque l'appareil est passé de l'état de stockage de masse USB à l'état normal ?

Intent.ACTION_USER_PRESENT;
//

Intent.ACTION_WALLPAPER_CHANGED;
//Diffuser lorsque le fond d'écran de l'appareil a été modifié

4. Résumé de cette section :

D'accord, c'est tout pour en savoir plus sur BroadcastReceiver. Si vous avez des ajouts ou des suggestions, n'hésitez pas à les faire ~. Très reconnaissant~