Android-Intent und Filter
Ein Android-Intent ist eine abstrakte Beschreibung einer auszuführenden Operation. Er kann über startActivity eine Activity starten, über broadcastIntent einen Broadcast an jede daran interessierte Broadcast-Receiver-Komponente senden und über startService(Intent) oder bindService(Intent, ServiceConnection, int) mit einem Hintergrunddienst kommunizieren.
Der Intent selbst (ein Intent-Objekt) ist eine passive Datenstruktur, die eine abstrakte Beschreibung der auszuführenden Operation enthält.
Angenommen, Sie haben eine Activity, die einen E-Mail-Client öffnen und eine E-Mail über ein Android-Gerät senden muss. Zu diesem Zweck muss Ihre Activity ein ACTION_SEND mit einem geeigneten Selector an den Android-Intent-Handler senden. Der angegebene Selector stellt eine geeignete Schnittstelle für den Benutzer bereit, um zu entscheiden, wie seine E-Mail-Daten gesendet werden sollen.
Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
email.putExtra(Intent.EXTRA_EMAIL, recipients);
email.putExtra(Intent.EXTRA_SUBJECT, subject.getText().toString());
email.putExtra(Intent.EXTRA_TEXT, body.getText().toString());
startActivity(Intent.createChooser(email, "Choose an email client from..."));
Die obige Syntax ruft die Methode startActivity auf, um die E-Mail-Activity zu öffnen, und das Ergebnis der Codeausführung sieht wie folgt aus:

Angenommen, Sie haben eine Activity, die eine URL in einem Browser auf einem Android-Gerät öffnen muss. Zu diesem Zweck sendet Ihre Activity einen ACTION_WEB_SEARCH-Intent an den Android-Intent-Handler, um die angegebene URL im Browser zu öffnen. Der Intent-Handler analysiert eine Reihe von Activities und wählt diejenige aus, die am besten zu Ihrem Intent passt; in diesem Beispiel ist dies die Webbrowser-Activity. Der Intent-Handler übergibt Ihre Webadresse an den Webbrowser und öffnet die Webbrowser-Activity.
String q = "https://www.example.com"; Intent intent = new Intent(Intent.ACTION_WEB_SEARCH ); intent.putExtra(SearchManager.QUERY, q); startActivity(intent);
Das obige Beispiel sucht nach „www.example.com“ in der Android-Suchmaschine und präsentiert die Keyword-Ergebnisse in einer Activity.
Für jede Komponente – Activity, Service und Broadcast Receiver – gibt es unabhängige Mechanismen zur Zustellung von Intents.
| Nein. | Methode und Beschreibung |
|---|---|
| 1 | Context.startActivity(): Der Intent wird an diese Methode übergeben, um eine neue Activity zu starten oder eine vorhandene Activity etwas Neues tun zu lassen. |
| 2 | Context.startService(): Der Intent wird an diese Methode übergeben, um einen Service zu initialisieren oder neue Informationen an einen bereits laufenden Service zu übergeben. |
| 3 | Context.sendBroadcast(): Der Intent wird an diese Methode übergeben, und die Informationen werden an alle Broadcast Receiver zugestellt, die daran interessiert sind. |
Intent-Objekt
Ein Intent-Objekt ist ein Bündel von Informationen. Der von einer Komponente empfangene Intent ähnelt den Informationen, die vom Android-System empfangen werden.
Ein Intent-Objekt enthält die folgenden Komponenten, je nachdem, was kommuniziert oder ausgeführt werden soll.
Aktion
Dies ist ein obligatorischer Teil des Intent-Objekts, ausgedrückt als Zeichenfolge. Bei einem Broadcast-Intent wird die Aktion gemeldet, sobald sie auftritt. Die Aktion bestimmt weitgehend, wie die anderen Teile des Intents organisiert sind. Die Klasse Intent definiert eine Reihe von Aktionskonstanten, die verschiedenen Intents entsprechen. Hier ist eineAndroid Intent standard actionsListe.
Die Aktion in einem Intent-Objekt kann über die Methode setAction() festgelegt und über die Methode getAction() gelesen werden.
Daten
Fügen Sie dem Intent-Filter Datenspezifikationen hinzu. Diese Spezifikation kann nur ein Datentyp (wie ein MIME-Typ-Attribut), ein URI oder sowohl ein Datentyp als auch ein URI sein. Der URI wird durch Attribute verschiedener Teile angegeben.
Diese Attribute, die das URI-Format angeben, sind optional, aber sie sind auch unabhängig voneinander –
- Wenn der Intent-Filter kein Schema angibt, werden alle anderen URI-Attribute ignoriert.
- Wenn für den Filter kein Host angegeben ist, werden das Port-Attribut und alle Pfadattribute ignoriert.
Die Methode setData() kann Daten nur als URI angeben, setType() kann Daten nur als MIME-Typ angeben, und setDataAndType() kann sowohl einen URI als auch einen MIME-Typ angeben. Der URI wird über getData() gelesen und der Typ wird über getType() gelesen.
Das Folgende sind einige Beispiele für Aktions-/Datenpaare –
| Nein. | Aktions-/Datenpaar und Beschreibung |
|---|---|
| 1 | ACTION_VIEW content://contacts/people/1: Zeigt die Informationen des Benutzers mit ID 1 an. |
| 2 | ACTION_DIAL content://contacts/people/1: Zeigt die Telefonwählhilfe an und füllt die Daten von Benutzer 1 ein. |
| 3 | ACTION_VIEW tel:123: Zeigt die Telefonwählhilfe an und füllt die angegebene Nummer ein. |
| 4 | ACTION_DIAL tel:123: Zeigt den Telefonwähler an und füllt die angegebene Nummer ein. |
| 5 | ACTION_EDIT content://contacts/people/1: Bearbeitet die Informationen des Benutzers mit der ID 1. |
| 6 | ACTION_VIEW content://contacts/people/: Zeigt die Liste der Benutzer zur Ansicht an. |
| 7 | ACTION_SET_WALLPAPER: Zeigt die Einstellungen zur Hintergrundbildauswahl an. |
| 8 | ACTION_SYNC: Synchronisiert Daten. Der Standardwert ist: android.intent.action.SYNC |
| 9 | ACTION_SYSTEM_TUTORIAL: Startet ein plattformdefiniertes Tutorial (Standard-Tutorial oder Start-Tutorial) |
| 10 | ACTION_TIMEZONE_CHANGED: Benachrichtigt, wenn sich die Zeitzone geändert hat. |
| 11 | ACTION_UNINSTALL_PACKAGE: Führt den Standard-Deinstaller aus. |
Kategorie
Kategorien sind optionale Bestandteile eines Intents, ein String, der zusätzliche Informationen über den Typ der Komponente enthält, die den Intent verarbeiten soll. Die Methode addCategory() fügt dem Intent-Objekt eine Kategorie hinzu, die Methode removeCategory() entfernt eine zuvor hinzugefügte Kategorie, und getCategories() ruft alle im Intent-Objekt festgelegten Kategorien ab. Hier ist dieAndroid-Intent-StandardkategorienListe.
Weitere Informationen finden Sie in den Intent-Filtern im folgenden Abschnitt, um zu verstehen, wie wir Kategorien verwenden, um die passende Activity für einen entsprechenden Intent auszuwählen.
Extras
Dies sind zusätzliche Informationen in Schlüssel-Wert-Paaren, die an die Komponente übergeben werden, die den Intent verarbeiten wird. Sie werden über die Methode putExtras() festgelegt und über die Methode getExtras() gelesen. Hier ist dieAndroid-Intent-Standard-ExtrasListe.
Flags
Diese Flags sind optionale Bestandteile eines Intents und geben an, wie das Android-System eine Activity starten und wie damit umgegangen werden soll, nachdem sie gestartet wurde.
| Nein. | Flags und Beschreibungen |
|---|---|
| 1 | FLAG_ACTIVITY_CLEAR_TASK: Wenn dieses Flag im Intent gesetzt und über Context.startActivity übergeben wird, bewirkt es, dass alle vorhandenen Tasks, die mit der Activity verknüpft sind, geleert werden, bevor die Activity gestartet wird. Die Activity wird zur Wurzel eines leeren Tasks, und alle alten Activities werden beendet. Dieses Flag kann in Kombination mit FLAG_ACTIVITY_NEW_TASK verwendet werden. |
| 2 | FLAG_ACTIVITY_CLEAR_TOP: Wenn dieses Flag gesetzt ist, wird die Activity im aktuell laufenden Task gestartet. Dadurch wird keine neue Instanz der Activity gestartet; alle Activities darüber werden geschlossen, und dieser Intent wird als neuer Intent an die vorhandene (derzeit oberste) Activity übergeben. |
| 3 | FLAG_ACTIVITY_NEW_TASK: Dieses Flag wird im Allgemeinen verwendet, um der Activity ein Verhalten im Stil eines "Launchers" zu verleihen: dem Benutzer Daten bereitzustellen, die unabhängig ausgeführt werden können, und eine vollständige und unabhängige Activity zu starten. |
Komponentenname
Das Komponentenname-Objekt ist ein optionales Feld, das eine Activity-, Service- oder Broadcast-Receiver-Klasse repräsentiert. Wenn es gesetzt ist, wird das Intent-Objekt an eine Instanz der angegebenen Klasse übergeben; andernfalls verwendet Android andere Informationen im Intent, um ein geeignetes Ziel zu finden. Der Komponentenname wird über setComponent(), setClass() oder setClassName() festgelegt und über getComponent() abgerufen.
Arten von Intents
Android unterstützt zwei Arten von Intents.

Expliziter Intent
Explizite Intents werden verwendet, um die interne Welt einer Anwendung zu verbinden. Angenommen, Sie müssen eine Activity mit einer anderen verbinden; dann können wir einen expliziten Intent verwenden. Die folgende Abbildung zeigt das Verbinden der ersten Activity mit der zweiten Activity durch Klicken auf eine Schaltfläche.

Diese Intents geben die Zielkomponente namentlich an und werden typischerweise für die Nachrichtenübermittlung innerhalb einer Anwendung verwendet – zum Beispiel, wenn eine Activity eine untergeordnete Activity oder eine gleichgeordnete Activity startet. Zum Beispiel:
// 通过指定类名的显式意图 Intent i = new Intent(FirstActivity.this, SecondAcitivity.class); // 启动目标活动 startActivity(i);
Impliziter Intent
Diese Intents benennen kein Ziel, und das Feld für den Komponentennamen ist leer. Implizite Intents werden häufig verwendet, um Komponenten anderer Anwendungen zu aktivieren. Zum Beispiel:
Intent read1=new Intent(); read1.setAction(android.content.Intent.ACTION_VIEW); read1.setData(ContactsContract.Contacts.CONTENT_URI); startActivity(read1);
Der obige Code erzeugt das folgende Ergebnis:

Wenn die Zielkomponente den Intent empfängt, kann sie die Methode getExtras() verwenden, um die von der Quellkomponente gesendeten zusätzlichen Daten abzurufen. Zum Beispiel:
// 在代码中的合适位置获取包对象
Bundle extras = getIntent().getExtras();
// 通过键解压数据
String value1 = extras.getString("Key1");
String value2 = extras.getString("Key2");
Beispiel
Das folgende Beispiel demonstriert die Verwendung von Android-Intents, um die Funktionalität verschiedener integrierter Android-Anwendungen zu starten.
| Schritte | Beschreibung |
|---|---|
| 1 | Erstellen Sie eine Android-Anwendung mit der Android Studio IDE, nennen Sie sie Intent filter, mit dem Paketnamen com.example.intentfilter. Stellen Sie beim Erstellen des Projekts sicher, dass das Ziel-SDK und die Kompilierung das neueste Android SDK verwenden, um erweiterte APIs zu nutzen. |
| 2 | Ändern Sie die Datei src/com.example.intentfilter/MainActivity.java und fügen Sie Code hinzu, um zwei Listener zu definieren, die den beiden Schaltflächen "Launch Browser" und "Launch Phone" entsprechen. |
| 3 | Ändern Sie die Layoutdatei res/layout/activity_main.xml und fügen Sie drei Schaltflächen in einem linearen Layout hinzu. |
| 4 | Starten Sie den Android-Emulator, um die Anwendung auszuführen und die Ergebnisse der an der Anwendung vorgenommenen Änderungen zu überprüfen. |
Das Folgende ist der Inhalt der Datei src/com.example.intentfilter/MainActivity.java:
package com.example.intentfilter;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
public class MainActivity extends ActionBarActivity {
Button b1,b2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b1=(Button)findViewById(R.id.button);
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse("https://www.example.com"));
startActivity(i);
}
});
b2=(Button)findViewById(R.id.button2);
b2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(android.content.Intent.ACTION_VIEW,Uri.parse("tel:9510300000"));
startActivity(i);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
Das Folgende ist der Inhalt der Datei res/layout/activity_main.xml:
<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_below="@+id/textView1"
android:layout_centerHorizontal="true" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton"
android:src="@drawable/ic_launcher.html"
android:layout_below="@+id/textView2"
android:layout_centerHorizontal="true" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText"
android:layout_below="@+id/imageButton"
android:layout_alignRight="@+id/imageButton"
android:layout_alignEnd="@+id/imageButton" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="启动浏览器"
android:id="@+id/button"
android:layout_alignTop="@+id/editText"
android:layout_alignRight="@+id/textView1"
android:layout_alignEnd="@+id/textView1"
android:layout_alignLeft="@+id/imageButton"
android:layout_alignStart="@+id/imageButton" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="启动电话"
android:id="@+id/button2"
android:layout_below="@+id/button"
android:layout_alignLeft="@+id/button"
android:layout_alignStart="@+id/button"
android:layout_alignRight="@+id/textView2"
android:layout_alignEnd="@+id/textView2" />
</RelativeLayout>
Das Folgende ist der Inhalt von res/values/strings/xml, der zwei neue Konstanten definiert.
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Intent filter</string> <string name="action_settings">Settings</string> </resources>
Das Folgende ist der Inhalt der Standard-AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.intentfilter"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="22" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Base.Theme.AppCompat" >
<activity
android:name="com.example.intentfilter.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Lassen Sie uns die gerade geänderte Intent filter-Anwendung ausführen. Ich gehe davon aus, dass Sie während der Umgebungseinrichtung 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 gut geht, wird Folgendes im Emulatorfenster angezeigt:

Klicken Sie nun auf die Schaltfläche "Launch Browser", die einen Browser gemäß der Konfiguration startet und https://www.example.com wie folgt anzeigt:

Auf ähnliche Weise können Sie auf die Schaltfläche "Launch Phone" klicken, um die Telefonschnittstelle zu öffnen, die es Ihnen ermöglicht, die bereits angegebene Telefonnummer zu wählen.
Intent Filter
Sie haben gesehen, wie man Intents verwendet, um eine andere Activity aufzurufen. Das Android-Betriebssystem verwendet Filter, um anzugeben, welche Activities, Dienste und Broadcast-Empfänger Intents verarbeiten, basierend auf der Aktion, Kategorie und dem Datenmuster, die vom Intent angegeben werden. Verwenden Sie das <intent-filter>-Element in der Manifestdatei, um die entsprechenden Aktionen, Kategorien und Datentypen in Activities, Diensten und Broadcast-Empfängern aufzulisten.
Das folgende Beispiel zeigt einen Teil der AndroidManifest.xml-Datei, der angibt, dass eine Activity com.example.intentfilter.CustomActivity durch die festgelegte Aktion, Kategorie und Daten aufgerufen werden kann:
<activity android:name=".CustomActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="com.example.MyApplication.LAUNCH" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" />
</intent-filter>
</activity>
Wenn eine Activity durch den obigen Filter definiert ist, können andere Activities sie auf folgende Weise aufrufen. Verwenden Sie android.intent.action.VIEW, verwenden Sie die Aktion com.example.intentfilter.LAUNCH und geben Sie die Kategorie android.intent.category.DEFAULT an.
Das <data>-Element gibt den Datentyp an, den die aufzurufende Activity erwartet. Im obigen Beispiel beginnen die von der benutzerdefinierten Activity erwarteten Daten mit "http://".
Es gibt Fälle, in denen ein Intent durch den Filter an mehrere Activities oder Dienste übermittelt wird und der Benutzer gefragt wird, welche Komponente gestartet werden soll. Wenn keine Zielkomponente gefunden wird, tritt eine Ausnahme auf.
Bevor eine Activity aufgerufen wird, führt Android eine Reihe von Überprüfungen durch:
- Der Filter <intent-filter> muss eine oder mehrere Aktionen auflisten und darf nicht leer sein; der Filter muss mindestens eine enthalten
Element, andernfalls blockiert es alle Intents. Wenn mehrere Aktionen angegeben sind, versucht Android, eine der angegebenen Aktionen abzugleichen, bevor die Activity aufgerufen wird. - Ein Filter <intent-filter> kann null, eine oder mehrere Kategorien auflisten. Wenn keine Kategorien angegeben sind, besteht Android diesen Test. Wenn mehrere Kategorien angegeben sind, besteht der Intent den Kategorietest nur, wenn jede Kategorie des Intent-Objekts mit einer der Kategorien im Filter übereinstimmt.
- JedesEin Element kann einen URI und einen Datentyp (MIME-Typ) angeben. Für jeden Teil des URI gibt es separate Attribute: Schema, Host, Port und Pfad. Ein Intent enthält einen URI und einen Typ, und er besteht den Datentyp-Test nur, wenn sein Typ mit einem der im Filter aufgeführten Typen übereinstimmt.
Beispiel
Die folgenden Beispiele sind einige Modifikationen der obigen Beispiele. Hier sehen wir, wie Android einen Konflikt auflöst, wenn ein Intent zwei definierte Activities aufruft; wie Filter verwendet werden, um eine benutzerdefinierte Activity aufzurufen; und welche Ausnahme auftritt, wenn keine passende Activity für den Intent definiert ist.
| Schritte | Beschreibung |
|---|---|
| 1 | Verwenden Sie die Android Studio IDE, um eine Android-Anwendung zu erstellen, und nennen Sie sie Intent filter, mit dem Paketnamen com.example.intentfilter. Achten Sie beim Erstellen des Projekts darauf, dass das Target-SDK und die Kompilierung mit der neuesten Version des Android SDK erweiterte APIs verwenden. |
| 2 | Ändern Sie die Datei src/com.example.intentfilter/MainActivity.java, und fügen Sie Code hinzu, um drei Listener zu definieren, die den drei in der Layoutdatei definierten Buttons entsprechen. |
| 3 | Fügen Sie die Datei src/com.example.intentfilter/CustomActivity.java hinzu, die eine Activity enthalten soll, die von verschiedenen Intents aufgerufen werden kann. |
| 4 | Ändern Sie die Datei res/layout/activity_main.xml, um drei Buttons in einem linearen Layout hinzuzufügen. |
| 5 | Fügen Sie die Layoutdatei res/layout/custom_view.xml hinzu, und fügen Sie ein einfaches |
| 6 | Ändern Sie die Datei AndroidManifest.xml und fügen Sie <intent-filter> hinzu, um die Intent-Regeln für den Aufruf der benutzerdefinierten Activity zu definieren. |
| 7 | Starten Sie den Android-Emulator, um die Anwendung auszuführen und das Ergebnis der an der Anwendung vorgenommenen Änderungen zu überprüfen. |
Das Folgende ist der Inhalt von src/com.example.intentfilter/MainActivity.java:
package com.example.intentfilter;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
public class MainActivity extends ActionBarActivity {
Button b1,b2,b3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b1=(Button)findViewById(R.id.button);
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(android.content.Intent.ACTION_VIEW,Uri.parse("https://www.example.com"));
startActivity(i);
}
});
b2=(Button)findViewById(R.id.button2);
b2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent("com.example.intentfilter.LAUNCH",Uri.parse("https://www.example.com"));
startActivity(i);
}
});
b3=(Button)findViewById(R.id.button3);
b3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent("com.example.intentfilter.LAUNCH",Uri.parse("https://www.example.com"));
startActivity(i);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
Das Folgende ist der Inhalt von src/com.example.intentfilter/CustomActivity.java:
package com.example.intentfilter;
import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.widget.TextView;
public class CustomActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.custom_view);
TextView label = (TextView) findViewById(R.id.show_data);
Uri url = getIntent().getData();
label.setText(url.toString());
}
}
Das Folgende ist der Inhalt von res/layout/activity_main.xml:
<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_below="@+id/textView1"
android:layout_centerHorizontal="true" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton"
android:src="@drawable/ic_launcher.html"
android:layout_below="@+id/textView2"
android:layout_centerHorizontal="true" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText"
android:layout_below="@+id/imageButton"
android:layout_alignRight="@+id/imageButton"
android:layout_alignEnd="@+id/imageButton" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="通过View动作启动浏览器"
android:id="@+id/button"
android:layout_alignTop="@+id/editText"
android:layout_alignRight="@+id/textView1"
android:layout_alignEnd="@+id/textView1"
android:layout_alignLeft="@+id/imageButton"
android:layout_alignStart="@+id/imageButton" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="通过Launch动作启动浏览器"
android:id="@+id/button2"
android:layout_below="@+id/button"
android:layout_alignLeft="@+id/button"
android:layout_alignStart="@+id/button"
android:layout_alignRight="@+id/textView2"
android:layout_alignEnd="@+id/textView2" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="异常情况"
android:id="@+id/button3"
android:layout_below="@+id/button2"
android:layout_alignLeft="@+id/button2"
android:layout_alignStart="@+id/button2"
android:layout_alignRight="@+id/textView2"
android:layout_alignEnd="@+id/textView2" />
</RelativeLayout>
Das Folgende ist der Inhalt der Datei res/layout/custom_view.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:id="@+id/show_data"
android:layout_width="fill_parent"
android:layout_height="400dp"/>
</LinearLayout>
Das Folgende ist der Inhalt der Datei res/values/strings.xml:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">My Application</string> <string name="action_settings">Settings</string> </resources>
Das Folgende ist der Inhalt der Datei AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.intentfilter"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="22" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Base.Theme.AppCompat" >
<activity
android:name="com.example.intentfilter.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.example.intentfilter.CustomActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="com.example.intentfilter.LAUNCH" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" />
</intent-filter>
</activity>
</application>
</manifest>
Lassen Sie uns die gerade geänderte Intent-Filter-Anwendung ausführen. Ich gehe davon aus, dass Sie die AVD beim Einrichten der Umgebung erstellt haben. Öffnen Sie die Activity-Datei in Ihrem Projekt und klicken Sie auf die
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 gut geht, wird Folgendes im Emulatorfenster angezeigt:

Klicken Sie auf die erste Schaltfläche „Browser mit View-Aktion starten“. Hier definieren wir unsere benutzerdefinierte Activity so, dass sie „android.intent.action.VIEW“ enthält, und das Android-System hat bereits eine Standard-Activity definiert, die der VIEW-Aktion entspricht, um den Webbrowser zu starten, daher zeigt Android die folgenden Optionen an, aus denen Sie die Activity auswählen können, die Sie starten möchten:

Wenn Sie den Browser wählen, startet Android den Webbrowser und öffnet die Website www.example.com. Wenn Sie die Option IntentDemo wählen, startet Android CustomActivity, die nichts anderes tut, als die übergebenen Daten zu erfassen und in einem TextView anzuzeigen.

Kehren Sie nun mit der Zurück-Taste zurück und klicken Sie auf die Schaltfläche "Launch browser with Launch action". Hier wendet Android den Filter an, um die definierte Activity auszuwählen, und startet einfach die benutzerdefinierte Activity.
Verwenden Sie erneut die Zurück-Taste, um zurückzukehren, und klicken Sie auf die Schaltfläche "Exception condition". Hier versucht Android, einen gültigen Filter zu finden, der durch den Intent vorgegeben wird, findet jedoch keine definierte gültige Activity. Da wir https anstelle von http als Daten verwendet und die korrekte Action angegeben haben, hat Android eine Exception ausgelöst. Wie folgt:
