Android-Broadcast-Receiver

Broadcast Receiver werden verwendet, um auf Broadcast-Nachrichten zu reagieren, die von anderen Anwendungen oder vom System gesendet werden. Diese Nachrichten werden manchmal Ereignisse oder Intents genannt. Beispielsweise kann eine Anwendung einen Broadcast initiieren, um andere Anwendungen darüber zu informieren, dass einige Daten auf das Gerät heruntergeladen wurden und für sie verfügbar sind. Auf diese Weise können Broadcast Receiver geeignete Aktionen definieren, um diese Kommunikation abzufangen.

Die folgenden zwei wichtigen Schritte sind erforderlich, damit die Broadcast-Intents des Systems mit Broadcast Receivern funktionieren.

  • Erstellen eines Broadcast Receivers
  • Registrieren eines Broadcast Receivers

Es gibt einen zusätzlichen Schritt. Um benutzerdefinierte Intents zu implementieren, müssen Sie diese Intents erstellen und als Broadcast senden.


Erstellen eines Broadcast Receivers

Ein Broadcast Receiver muss als Unterklasse der Klasse BroadcastReceiver implementiert und die Methode onReceive() überschrieben werden, um Nachrichten zu empfangen, die ein Intent-Objekt als Parameter entgegennehmen.

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

Registrieren eines Broadcast Receivers

Eine Anwendung registriert einen Broadcast Receiver in AndroidManifest.xml, um auf bestimmte Broadcast-Intents zu hören. Angenommen, wir registrieren MyReceiver, um auf das vom System erzeugte Ereignis ACTION_BOOT_COMPLETED zu hören. Dieses Ereignis wird gesendet, wenn der Startvorgang des Android-Systems abgeschlossen ist.

广播接收器(Broadcast Receivers)

<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>

Nun wird jedes Mal, wenn das Android-Gerät gestartet wird, dies vom Broadcast Receiver MyReceiver abgefangen, und die in onReceive() implementierte Logik wird ausgeführt.

Es gibt viele vom System erzeugte Ereignisse, die als statische Konstantenwerte in der Intent-Klasse definiert sind. Die folgende Tabelle listet die wichtigen Systemereignisse auf.

Ereigniskonstante Beschreibung
android.intent.action.BATTERY_CHANGED Ein Sticky-Broadcast, der den Ladezustand, Ladestand und andere Informationen des Akkus enthält.
android.intent.action.BATTERY_LOW Zeigt einen niedrigen Akkustand auf dem Gerät an.
android.intent.action.BATTERY_OKAY Zeigt an, dass der Akku nach einem niedrigen Zustand jetzt wieder in Ordnung ist.
android.intent.action.BOOT_COMPLETED Wird einmal gesendet, nachdem das System den Startvorgang abgeschlossen hat.
android.intent.action.BUG_REPORT Zeigt eine Activity zum Melden eines Fehlers an.
android.intent.action.CALL Ruft die durch die Anrufdaten angegebene Person an.
android.intent.action.CALL_BUTTON Der Benutzer klickt auf die Schaltfläche "Call", um den Dialer oder eine andere geeignete Oberfläche zum Wählen zu öffnen.
android.intent.action.DATE_CHANGED Das Datum hat sich geändert.
android.intent.action.REBOOT Das Gerät wurde neu gestartet.

Senden benutzerdefinierter Intents

Wenn Sie benutzerdefinierte Intents innerhalb Ihrer Anwendung generieren und senden möchten, müssen Sie diese Intents über sendBroadcast() in Ihrer Activity-Klasse erstellen und senden. Wenn Sie die Methode sendStickyBroadcast(Intent) verwenden, ist der Intent sticky, was bedeutet, dass der gesendete Intent nach Abschluss des Broadcasts bestehen bleibt.

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

Ein Intent mit com.example.CUSTOM_INTENT kann auf dieselbe Weise registriert werden, wie wir zuvor systemgenerierte Intents registriert haben.

<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.example.CUSTOM_INTENT">
         </action>
      </intent-filter>

   </receiver>
</application>

Beispiel

Dieses Beispiel erklärt, wie Sie einen Broadcast-Empfänger erstellen, um einen benutzerdefinierten Intent abzufangen. Sobald Sie mit benutzerdefinierten Intents vertraut sind, können Sie Ihre Anwendung so programmieren, dass sie systemgenerierte Intents abfängt. Befolgen wir die folgenden Schritte, um die Android-Anwendung zu ändern, die wir im Kapitel zum Hello-World-Beispiel erstellt haben.

Schritt Beschreibung
1 Verwenden Sie Android Studio, um eine Android-Anwendung zu erstellen, nennen Sie sie broadcastreceiver, und platzieren Sie sie im Kapitel zum Hello-World-Beispiel unter dem Paket com.example.broadcastreceiver.
2 Ändern Sie die Haupt-Activity-Datei MainActivity.java, um die Methode broadcastIntent() hinzuzufügen.
3 Erstellen Sie eine neue Java-Datei namens MyReceiver.java unter dem Paket com.example.broadcastreceiver, um den Broadcast-Empfänger zu definieren.
4 Eine Anwendung kann ohne Einschränkungen einen oder mehrere benutzerdefinierte oder System-Intents verarbeiten. Jeder Intent, den Sie abfangen möchten, muss in AndroidManifest.xml mit dem <receiver.../>-Tag registriert werden.
5 Ändern Sie den Standardinhalt der Datei res/layout/activity_main.xml, um eine Schaltfläche zum Broadcasten eines Intents aufzunehmen.
6 Es ist nicht nötig, die String-Ressourcendatei zu ändern; Android Studio kümmert sich um die Datei string.xml.
7 Starten Sie den Android-Emulator, um die Anwendung auszuführen und die Ergebnisse der an der Anwendung vorgenommenen Änderungen zu überprüfen.

Unten sehen Sie den Inhalt der geänderten Haupt-Activity-Datei src/com.example.broadcastreceiver/MainActivity.java. Diese Datei enthält jede der grundlegenden Lifecycle-Methoden. Wir haben die Methode broadcastIntent() hinzugefügt, um benutzerdefinierte Ereignisse zu broadcasten.

package com.example.broadcastreceiver;

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

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    // 广播自定义意图
    public void broadcastIntent(View view){
        Intent intent = new Intent();
        intent.setAction("cn.programmer.CUSTOM_INTENT");
        sendBroadcast(intent);
    }
}

Unten sehen Sie den Inhalt von src/com.example.broadcastreceiver/MyReceiver.java:

package com.example.broadcastreceiver;

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

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "检测到意图。", Toast.LENGTH_LONG).show();
    }
}

Als Nächstes ändern Sie die Datei AndroidManifest.xml. Hier binden wir unseren Broadcast-Empfänger ein, indem wir das <receiver.../>-Tag hinzufügen:

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

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="22" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main" >

            <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="cn.programmer.CUSTOM_INTENT">
                </action>
            </intent-filter>

        </receiver>

    </application>

</manifest>

Unten sehen Sie den Inhalt der Datei res/layout/activity_main.xml, die eine Schaltfläche zum Broadcasten eines benutzerdefinierten Intents enthält.

<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="广播实例"
        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="www.example.com"
        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/ic_launcher.html"
        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="广播意图"
        android:onClick="broadcastIntent"
        android:layout_below="@+id/imageButton"
        android:layout_centerHorizontal="true" />

</RelativeLayout>

Unten sehen Sie den Inhalt der Datei res/values/strings.xml, die zwei neue Konstanten definiert.

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">Android Broadcast Receiver</string>
    <string name="action_settings">Settings</string>
    <string name="menu_settings">Settings</string>
    <string name="title_activity_main">Main Activity</string>

</resources>

Lassen Sie uns die Hello-World!-Anwendung ausführen, die wir gerade geändert haben. Ich gehe davon aus, dass Sie beim Einrichten der Umgebung bereits ein AVD erstellt haben. Öffnen Sie die Activity-Datei in Ihrem Projekt, und klicken Sie auf das图片Symbol in der Symbolleiste, um die Anwendung in Android Studio auszuführen. Android Studio installiert die Anwendung auf dem AVD und startet sie. Wenn alles reibungslos verläuft, wird Folgendes im Emulatorfenster angezeigt:

图片

Klicken Sie nun auf die Schaltfläche "Broadcast Intent", um unseren benutzerdefinierten Intent zu broadcasten. Dadurch wird unser benutzerdefinierter Intent "cn.programmer.CUSTOM_INTENT" gebroadcastet, der von unserem registrierten Broadcast-Empfänger MyReceiver abgefangen wird und die von uns implementierte Logik ausführt. Unten im Emulator wird ein Toast angezeigt, wie folgt:

图片

Sie können versuchen, weitere Broadcast-Empfänger zu implementieren, um vom System generierte Intents abzufangen, z. B. Systemstart, Datumsänderung, niedriger Akkustand und so weiter.

Andere Erweiterungen