Android - Rundfunkempfänger
Broadcast Receivers Antworten Sie einfach auf Broadcast-Nachrichten von anderen Anwendungen oder vom System selbst. Diese Nachrichten werden manchmal als Ereignisse oder Absichten bezeichnet. Beispielsweise können Anwendungen auch Broadcasts initiieren, um anderen Anwendungen mitzuteilen, dass einige Daten auf das Gerät heruntergeladen wurden und für sie verfügbar sind. Dies ist also der Broadcast-Empfänger, der diese Kommunikation abfängt und geeignete Maßnahmen einleitet.
Es gibt zwei wichtige Schritte, damit BroadcastReceiver für die vom System übertragenen Absichten funktioniert:
Broadcast-Empfänger erstellen.
Rundfunkempfänger registrieren
Es gibt einen zusätzlichen Schritt, falls Sie Ihre benutzerdefinierten Absichten implementieren möchten, dann müssen Sie diese Absichten erstellen und senden.
Broadcast-Empfänger erstellen
Ein Rundfunkempfänger ist als Unterklasse von implementiert BroadcastReceiver Klasse und Überschreiben der onReceive () -Methode, bei der jede Nachricht als empfangen wird Intent Objektparameter.
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
}
}
Rundfunkempfänger registrieren
Eine Anwendung wartet auf bestimmte Broadcast-Absichten, indem sie einen Broadcast-Empfänger in der Datei AndroidManifest.xml registriert . Bedenken Sie, dass wir MyReceiver für das vom System generierte Ereignis ACTION_BOOT_COMPLETED registrieren werden, das vom System ausgelöst wird, sobald das Android-System den Startvorgang abgeschlossen hat.
Rundfunkempfänger
<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>
Jedes Mal, wenn Ihr Android-Gerät gestartet wird, wird es von BroadcastReceiver MyReceiver abgefangen und die in onReceive () implementierte Logik wird ausgeführt.
Es gibt mehrere vom System generierte Ereignisse, die als endgültige statische Felder in der definiert sind IntentKlasse. In der folgenden Tabelle sind einige wichtige Systemereignisse aufgeführt.
Sr.Nr. | Ereigniskonstante & Beschreibung |
---|---|
1 | android.intent.action.BATTERY_CHANGED Sticky Broadcast mit Ladezustand, Ladezustand und anderen Informationen zum Akku. |
2 | android.intent.action.BATTERY_LOW Zeigt einen niedrigen Batteriestand des Geräts an. |
3 | android.intent.action.BATTERY_OKAY Zeigt an, dass der Akku nach dem Entladen jetzt in Ordnung ist. |
4 | android.intent.action.BOOT_COMPLETED Dies wird einmal gesendet, nachdem das System den Startvorgang beendet hat. |
5 | android.intent.action.BUG_REPORT Aktivität zum Melden eines Fehlers anzeigen. |
6 | android.intent.action.CALL Führen Sie einen Anruf bei einer durch die Daten angegebenen Person durch. |
7 | android.intent.action.CALL_BUTTON Der Benutzer drückte die "Anruf" -Taste, um zum Dialer oder einer anderen geeigneten Benutzeroberfläche zum Tätigen eines Anrufs zu gelangen. |
8 | android.intent.action.DATE_CHANGED Das Datum hat sich geändert. |
9 | android.intent.action.REBOOT Lassen Sie das Gerät neu starten. |
Benutzerdefinierte Absichten übertragen
Wenn Sie möchten, dass Ihre Anwendung selbst benutzerdefinierte Absichten generiert und sendet, müssen Sie diese Absichten mithilfe der sendBroadcast () -Methode in Ihrer Aktivitätsklasse erstellen und senden . Wenn Sie die Methode sendStickyBroadcast (Intent) verwenden, lautet die AbsichtstickyDies bedeutet, dass die Absicht, die Sie senden, nach Abschluss der Übertragung erhalten bleibt.
public void broadcastIntent(View view) {
Intent intent = new Intent();
intent.setAction("com.tutorialspoint.CUSTOM_INTENT");
sendBroadcast(intent);
}
Diese Absicht com.tutorialspoint.CUSTOM_INTENT kann auch auf ähnliche Weise registriert werden, wie wir die vom System generierte Absicht 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.tutorialspoint.CUSTOM_INTENT">
</action>
</intent-filter>
</receiver>
</application>
Beispiel
In diesem Beispiel wird erläutert, wie Sie BroadcastReceiver erstellen , um benutzerdefinierte Absichten abzufangen. Sobald Sie mit benutzerdefinierten Absichten vertraut sind, können Sie Ihre Anwendung so programmieren, dass systemgenerierte Absichten abgefangen werden. Befolgen Sie daher die folgenden Schritte, um die im Kapitel " Hello World-Beispiel" erstellte Android-Anwendung zu ändern :
Schritt | Beschreibung |
---|---|
1 | Mit Android Studio erstellen Sie eine Android-Anwendung und benennen sie unter dem Paket com.example.tutorialspoint7.myapplication als Meine Anwendung, wie im Kapitel Hello World-Beispiel erläutert . |
2 | Ändern Sie die Hauptaktivitätsdatei MainActivity.java , um die BroadcastIntent () -Methode hinzuzufügen . |
3 | Erstellen Sie eine neue Java-Datei mit dem Namen MyReceiver.java unter dem Paket com.example.tutorialspoint7.myapplication , um einen BroadcastReceiver zu definieren. |
4 | Eine Anwendung kann eine oder mehrere benutzerdefinierte und Systemabsichten ohne Einschränkungen verarbeiten. Jede Absicht, die Sie abfangen möchten, muss in Ihrer AndroidManifest.xml- Datei mit dem Tag <Empfänger ... /> registriert werden |
5 | Ändern Sie den Standardinhalt der Datei res / layout / activity_main.xml so , dass er eine Schaltfläche zum Senden von Absichten enthält. |
6 | Die String-Datei muss nicht geändert werden. Android Studio kümmert sich um die Datei string.xml. |
7 | Führen Sie die Anwendung aus, um den Android-Emulator zu starten, und überprüfen Sie das Ergebnis der in der Anwendung vorgenommenen Änderungen. |
Es folgt der Inhalt der geänderten Hauptaktivitätsdatei MainActivity.java. Diese Datei kann jede der grundlegenden Lebenszyklusmethoden enthalten. Wir haben die Methode uploadIntent () hinzugefügt , um eine benutzerdefinierte Absicht zu senden.
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);
}
}
Es folgt der Inhalt von 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();
}
}
Im Folgenden wird der geänderte Inhalt der Datei AndroidManifest.xml angezeigt . Hier haben wir das Tag <Empfänger ... /> hinzugefügt, um unseren Service einzuschließen:
<?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>
Es folgt der Inhalt von res/layout/activity_main.xml Datei mit einer Schaltfläche zum Senden unserer benutzerdefinierten Absicht -
<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>
Lassen Sie uns versuchen, unsere modifizierten auszuführen Hello World!Anwendung haben wir gerade geändert. Ich nehme an, Sie hatten Ihre erstelltAVDwährend der Einrichtung der Umgebung. Um die App in Android Studio auszuführen, öffnen Sie eine der Aktivitätsdateien Ihres Projekts und klicken Sie in der Symbolleiste auf das
Klicken Sie jetzt auf, um unsere benutzerdefinierte Absicht zu übertragen Broadcast IntentWenn Sie auf diese Schaltfläche klicken , wird unsere benutzerdefinierte Absicht "com.tutorialspoint.CUSTOM_INTENT" gesendet, die von unserem registrierten BroadcastReceiver, dh MyReceiver, abgefangen wird. Gemäß unserer implementierten Logik wird am unteren Rand des Simulators ein Toast wie folgt angezeigt:
Sie können versuchen, einen anderen BroadcastReceiver zu implementieren, um vom System generierte Absichten wie Systemstart, Änderungsdatum, schwache Batterie usw. abzufangen.