[JAVA] Programmierung ab 51 Jahren [Shakyo] Intent IntentFilter-Referenz

Intent

https://developer.android.com/guide/components/intents-common?hl=ja https://developer.android.com/guide/components/intents-filters.html?hl=ja#Receiving

Absicht ist ein Nachrichtenobjekt, das verwendet wird, wenn eine Aktion von einer anderen App-Komponente angefordert wird.

Intent kann entweder angeben, welche Komponente gestartet werden soll, oder das Android-System entscheiden lassen, welche Komponente gestartet werden soll. Ersteres wird als explizite Absicht und letzteres als implizite Absicht bezeichnet. Bei der Methode, die zu startende Komponente dem Android-System anzuvertrauen, werden die Informationen (\ ) im Manifest der Anwendung mit der zu durchsuchenden Komponente beschrieben, damit das Android-System die Komponente durchsuchen kann.

Durch Festlegen einer einfachen Aktion und der erforderlichen Daten im impliziten Intent-Objekt können Sie die Aktion starten, um die Aktion in einer anderen App auszuführen. Sie müssen die auszuführende Komponente nicht angeben.

Wenn Sie startActivity () oder startActivityResult () </ font> aufrufen und eine implizite Absicht übergeben, ermittelt das System mithilfe des Intent-Filters, welche App für die Verwendung dieser Absicht geeignet ist. anfangen. Wenn mehrere Apps Intent verwenden, wird ein Dialogfeld angezeigt, in dem der Benutzer die App auswählen kann.


Im Folgenden werden implizite Absichten beschrieben, die allgemeine Aktionen für jeden App-Typ ausführen, der Absichten verarbeiten kann.

COUTION
Wenn Sie auf Ihrem Gerät keine App haben, die implizite Absichten verwenden kann, führt die Verwendung von startActivity () zum Absturz der App. Um einen Absturz zu vermeiden, rufen Sie die Methode resolveActibity () (die Methode des Intent-Objekts) auf, um die Existenz der App zu überprüfen, die die Absicht empfangen kann. Wenn das Ergebnis nicht null ist, gibt es eine App, die Intent empfangen kann, und Sie können startActivity () sicher aufrufen. Wenn das Ergebnis null ist, verursacht die Absicht einen Absturz. Verwenden Sie sie daher nicht.

Intent und IntentFilter

https://developer.android.com/guide/components/intents-filters.html?hl=ja

Absicht erleichtert die Kommunikation zwischen Komponenten. Die folgenden drei sind grundlegende Verwendungsbeispiele.

Verwendungsbeispiel

  • Aktivität starten </ strong>
    Um eine neue Instanz von Aktivität zu starten (neuen Bildschirm erstellen), übergeben Sie Intent an startActivity () </ font> .. Die zu startende Aktivität wird in der Absicht beschrieben und die erforderlichen Daten werden festgelegt.
    Verwenden Sie startActivityForResult () </ font>, um das Ergebnis zu erhalten, wenn die Aktivität abgeschlossen ist. Die Aktivität verwendet den Rückruf onActivityResult () </ font>, um das Ergebnis als Intent-Objekt zu empfangen.
  • Dienststart </ strong>
    Der Dienst ist eine Komponente für Hintergrundvorgänge ohne Benutzeroberfläche. Mit Android5.0 (API21) oder höher können Sie den Dienst mit JobScheduler </ font> starten. Starten Sie den Dienst in Android 5.0 oder früher mit der Methode der Service-Klasse. Übergeben Sie Intent an einmalige Vorgänge wie das Herunterladen von Dateien an startService (). Stellen Sie den Dienst und die Daten so ein, dass sie in Absicht starten.
    Wenn die Client-Server-Schnittstelle für den Dienst festgelegt ist, kann die Absicht an bindService () </ font> übergeben und an den Dienst anderer Komponenten gebunden werden.
  • Broadcast Delivery </ strong>
    Broadcast ist eine Nachricht, die von jeder App empfangen werden kann. Das System sendet Sendungen über verschiedene Systemereignisse wie Terminalstart und Ladestart. Um an andere Apps zu senden, übergeben Sie die Absicht an sendBroadcast () </ font> oder sendOrderedBroadcast () </ font>.

Absichtstyp | Explizite Absicht Implizite Absicht

  • Explicit Intent </ strong>
    Geben Sie den Paketnamen der Zielanwendung oder den vollständigen Namen der Dekorationsklasse der Komponente an und geben Sie die Anwendung an, die Intent ausführt. In vielen Fällen kennt der Entwickler den Klassennamen der Aktivität oder des Dienstes, die er starten möchte, und verwendet daher eine explizite Absicht.
  • Implizite Absicht </ strong>
    Ernennen Sie keine bestimmte Komponente. Durch Festlegen der Verarbeitung und der erforderlichen Daten in der Absicht können diese von einer Komponente einer anderen Anwendung ausgeführt werden.
    Wenn Sie dem Benutzer beispielsweise einen bestimmten Ort auf der Karte anzeigen möchten, fordern Sie mit Intent an, den von einer anderen Anwendung auf der Karte angegebenen Ort anzuzeigen.

Verwenden Sie eine implizite Absicht, wenn Sie die Komponente, die die Aktivität verwaltet, dem Android-System anvertrauen, und eine explizite Absicht, wenn die Komponente spezifisch ist (nicht dem System anvertraut).

\ </ strong>

1. Aktivität (A) erstellt eine Absicht, die die Aktion beschreibt, und übergibt sie an startActivity () (startActivity (intent)) 2. Das Android-System durchsucht alle Apps und findet Absichtsfilter, die mit Absicht übereinstimmen 3. Wenn ein passender Intent-Filter gefunden wird, ruft das System die onCreate () -Methode der App auf und übergibt den Intent 4. Die gesuchte App startet eine Aktivität (B), die der Absicht entspricht.

Bei impliziter Absicht vergleicht das Android-System den Inhalt der Absicht mit dem Absichtsfilter, der in der Manifestdatei anderer Apps </ font> definiert ist. Wenn der Intent mit dem Intent-Filter übereinstimmt, startet das Android-System seine Komponente und liefert das Intent-Objekt. Wenn mehrere übereinstimmende Apps vorhanden sind, lassen Sie den Benutzer diese im Dialogfeld auswählen. Der Intent-Filter gibt die Art der Absicht an, die die Komponente in der Manifestdatei der App empfangen möchte.

Sie können beispielsweise einen Aktivitätsabsichtsfilter deklarieren, um eine Aktivität direkt von einer anderen App mit einem bestimmten Absichtstyp zu starten. Wenn Sie keinen Absichtsfilter für die Aktivität deklarieren, können Sie die Aktivität nur mit einer expliziten Absicht starten.

COUTION
Verwenden Sie explizite Absichten, wenn Sie mit Service beginnen. Verwenden Sie nicht den Intent-Filter des Dienstes. Die implizite Absicht in einem Dienst stellt ein Sicherheitsrisiko dar, da der Überblick darüber verloren geht, ob der Dienst auf die Absicht reagiert und der Benutzer den initiierten Dienst nicht kennt. In Android 5.0 und höher führt die Verwendung von bindService () mit einer impliziten Absicht dazu, dass das System eine Ausnahme auslöst.

Absicht aufbauen

Legen Sie im Intent-Objekt die Informationen fest, die für die Suche nach der vom Android-System gestarteten Komponente erforderlich sind, und die Informationen, die für die Komponente erforderlich sind, um die Aktion auszuführen (siehe unten).

  • Komponentenname
  • Aktion
  • Daten
  • Kategorie
  • Extra
  • -Flag
Intent intent = new Intent(this,MainActivity.class);
intent.setComponent()     // setClass(),setClassName(),Intent Constructor
intent.setAction()        // Intent Constructor
intent.setData()          // setType setDataAndType
intent.CATEFORY_BROWSABLE // CATEGORY_LAUNCHER
intent.putExtar()
intent.setFlags()

// Android Developer intent :von öffentlichen Konstrukteuren(Context packageContext, Class<?> cls)Referenz
//Spezifizierte Komponente(Class<?>)Erstellen Sie eine Absicht in
//Der Kontext ist AndroidSystem<-> app :Umgebungsinformationen übergeben
■ Komponentenname (ComponentName-Objekt)
  • Name der Startkomponente </ strong>
    Erforderlich für explizite Absichten. Verwenden Sie beim Starten des Dienstes außerdem eine explizite Absicht, um die Sicherheit zu gewährleisten.
  • Das ComponentName-Objekt kann unter Verwendung des vollständig dekorierten Klassennamens der Zielkomponente angegeben werden (z. B. com.example.ExampleActivity). Geben Sie mit der folgenden Methode usw. an.
    • setComponent()
    • setClass()
    • setClassName()
  • Absichtskonstruktor
■ Aktion

Eine Zeichenfolge, die die allgemeine Aktion (Anzeige oder Auswahl) angibt, die ausgeführt wird.

  • Für Broadcast Intent ist diese Zeichenfolge eine Aktion, die bereits ausgeführt und gemeldet wurde. Die Informationen, aus denen andere Absichten bestehen, wie z. B. die in den Daten und Extras enthaltenen Informationen, werden durch die Art der Aktion (Anzeige oder Auswahl) bestimmt.

  • In Ihrer App wird die zu startende Aktion von Intent oder von Intent festgelegt, um die Komponente Ihrer App von anderen Apps aus aufzurufen, aber Normalerweise Intent Geben Sie Aktionskonstanten an, die in der Klasse oder anderen Framework-Klassen </ font> definiert sind.

  • <Allgemeine Aktionskonstanten zum Starten einer Aktivität> </ strong>

  • ACTION_VIEW </ font> </ strong>
    Wenn dem Benutzer Informationen angezeigt werden, z. B. das in der App angezeigte Foto oder die in der Karten-App angezeigte Adresse. Verwenden Sie außerdem die Konstante ACTION_VIEW </ font> für die Absicht und übergeben Sie sie an startActivity ().

  • ACTION_SEND </ font> </ strong>
    ACTION_SEND ist gemeinsam genutzte Absicht </ font>. Wenn Daten vorhanden sind, die mit einer anderen App wie einer Mail-App oder einer Social-Sharing-App geteilt werden können, verwenden Sie die Konstante ACTION_SEND </ font> für Intent und übergeben Sie sie an startActivity ().

Die Konstanten, die andere Aktionen definieren, sind> https://developer.android.com/reference/android/content/Intent.html?hl=ja (siehe Inhalt)

Andere Aktionen werden an anderer Stelle im Android-Framework definiert. Die Aktion zum Öffnen eines bestimmten Bildschirms der Systemeinstellungs-App ist beispielsweise in den Einstellungen definiert.

Absichtsaktionen werden mit setAction () oder Intent-Konstruktor </ font> angegeben.

Geben Sie nach dem Definieren Ihrer eigenen Aktion (TIMETRAVEL) den Paketnamen der Anwendung als Präfix an (ACTION_TIMETRAVEL = " com.example.action.TIMETRAVEL ").

static final String ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL";

■ Daten

Ein URI (Uri-Objekt), der sich auf die zum Ausführen einer Aktion erforderlichen Daten und den MINE-Typ der Daten bezieht. Die Art der angegebenen Daten hängt von der Aktion der Absicht ab. Wenn die Aktion ACTION_EDIT </ font> lautet, werden die Daten auf den zu bearbeitenden Dokument-URI gesetzt.

Beim Erstellen einer Absicht kann es wichtig sein, den Datentyp (MIME) </ font> sowie den URI anzugeben. In der Bildanzeigeaktivität kann keine Musik abgespielt werden. Geben Sie den MIME-Typ der Daten an, damit das Android-System nach geeigneten Komponenten für den Intent suchen kann.

Es kann jedoch möglich sein, MIME aus dem URI zu schätzen. Wenn die Daten Inhalt sind, befindet sich der URI auf dem Terminal und wird vom ContentProvider gesteuert, sodass das Android-System den MIME-Typ anhand des URI ermitteln kann.

<Daten- / MIME-Typeinstellung>

--Stellen Sie nur den Daten-URI ein: setData () </ font> --Stellen Sie nur den MIME-Typ ein: setType () </ font>

  • Setzen Sie beide: Verwenden Sie setDataAndType ().
VORSICHT
Verwenden Sie beim Festlegen von URI und MIME nicht setData () und setType () (deaktivieren Sie die Werte des jeweils anderen). Es besteht ein Risiko). Stellen Sie beim Festlegen von beiden sicher, dass Sie setDataAndType () verwenden
■ Kategorie

Eine Zeichenfolge, die zusätzliche Informationen zum Komponententyp festlegt, der die Absicht verarbeitet. Die meisten Absichten erfordern keine Kategorien. Sie können in Absicht so viele Kategoriebeschreibungen festlegen, wie Sie möchten. Im Folgenden finden Sie einige Beispiele für häufig verwendete Kategorien.

  • CATEFORY_BROWSABLE
    Abhängig von der Zielaktivität zeigt der Browser Daten wie Bilder und E-Mail-Nachrichten an.
  • CATEGORY_LAUNCHER
    Zeigen Sie in der ersten Aktivität der Aufgabe die Aktivität in der Liste der Anwendungsstarter des Systems an.
■ Extra

Nach Komponentenname, Aktion, Daten oder Kategorie sucht das Android-System nach der entsprechenden App-Komponente. Weitere Informationen, die diese Suche nicht beeinflussen, finden Sie in den Intent Extras </ font>.

Legen Sie die Informationen fest, die zum Ausführen der Anforderungsaktion mit einem Schlüssel / Wert-Paar erforderlich sind. Aktionen verwenden bestimmte Arten von Daten-URIs oder bestimmte Extras.

Zusätzliche Daten sind die putExtra () </ font> -Methode, mit der Schlüssel- und Wertparameter hinzugefügt werden. Bundle </ font> kann alle zusätzlichen Daten festlegen, und putExtras () kann verwendet werden, um Bundle auf Intent </ font> festzulegen.

Verwenden Sie beispielsweise beim Erstellen einer Absicht zum Senden einer E-Mail mit ACTION_SEND </ font> den Schlüssel EXTRA_EMAIL </ font> an den Empfänger Sie können den Betreff auch mit der Taste EXTRA_SUBJECT </ font> angeben.

Die Intent-Klasse kann mehrere EXTRA_ * </ strong> -Konstanten für standardisierte Datentypen angeben. Wenn Sie Ihren eigenen zusätzlichen Schlüssel für die Absicht deklarieren möchten, die Ihre App erhält, geben Sie den Paketnamen der App als Präfix an (siehe unten).

static final String EXTRA_GIGAWATTS = "com.example.EXTRA_FIFAWATTS";
COUTION:
Verwenden Sie Parcelable oder Serializable nicht, wenn Sie von anderen Apps empfangene Absichten senden. Wenn die App versucht, auf die Bundle-Objektdaten zuzugreifen, und nicht auf die Paketierungs- oder Serialisierungsklassen zugreifen kann, löst das System eine RuntimeException aus.
■ Flagge

In der Flag Intent-Klasse definiert. Das Flag fungiert als Absichtsmetadaten (Informationen, die die Daten selbst angeben (Name, Datum, Erweiterung usw.), z. B. Dateien und Ordner). Das Flag gibt dem Android-System an, wie die Aktivität gestartet werden soll (zu welcher Aufgabe die Aktivität gehört usw.) und wie sie nach dem Start behandelt werden soll (ob sie in die Liste der letzten Aktivitäten aufgenommen werden soll usw.).

□ setFlags --Stellen Sie die Behandlung von Intent mit dem Flag ein. Die Einstellungen hängen vom Typ der von Intent ausgeführten Komponente ab. Das Flag ** FLAG_ACTIVITY_ * wird in ** ConText # startActivity ** verwendet, und das Flag ** FLAG_RECEIVER_ * wird in ** Context # sendBroadcast (Intent) ** verwendet. (Wenn Sie beispielsweise FLAG_ACTIVITY_NO_HISTORY festlegen, werden neue Aktivitäten nicht im Stapelverlauf aufgezeichnet.)

--setFlags () Weitere Informationen> https://developer.android.com/reference/android/content/Intent.html?hl=ja#setFlags (int)

Beispiel für explizite Absicht, implizite Absicht

Beispiel für eine explizite Absicht

Verwenden Sie beim Starten spezieller App-Komponenten die explizite Absicht. Um eine explizite Absicht zu erstellen, definieren Sie den Komponentennamen im Intent-Objekt. Andere Intent-Eigenschaften sind optional.

<Beispiel: Starten Sie "Download Service", um Dateien aus dem Web herunterzuladen>

//Angenommen, Sie möchten eine Aktivität ausführen.'this'Ist der Kontext.
//fileUrl ist die URL der Zeichenfolge.("http:://www.example.com/image.png ")
Intent downloadIntent = new Intent(this,DownloadService.class);
downloadIntent.setData(Uri.parse(fileUrl));
startService(downloadIntent);

Der Intent-Konstruktor (Context, Class) stellt den Kontext für die App und das Class-Objekt für die Komponente bereit. Auf diese Weise initiiert diese Absicht explizit die DownloadService-Klasse für die App.

Beispiel für implizite Absicht

Implicit Intent startet eine App auf einem Gerät, das eine Aktion angeben und ausführen kann. Implizite Absicht ist eine gute Wahl, wenn Sie diese Aktion nicht in Ihrer eigenen App ausführen möchten, Sie sie jedoch in einer anderen App ausführen können und der Benutzer auswählen soll, ob diese App verwendet werden soll.

Wenn Sie beispielsweise Inhalte haben, die Benutzer für andere freigeben sollen, erstellen Sie mit der Aktion ACTION_SEND </ font> eine Absicht und fügen Sie eine zusätzliche hinzu, um den freizugebenden Inhalt anzugeben. Machen. Wenn Sie diese Absicht verwenden, um startActivity () </ font> aufzurufen, kann der Benutzer auswählen, für welche App der Inhalt freigegeben werden soll.

COUTION:
Möglicherweise gibt es keine App, die die an startActivity () gesendete implizite Absicht verarbeiten kann, oder sie ist aufgrund von Dateibeschränkungen oder -einstellungen möglicherweise nicht zugänglich. In diesem Fall stürzt die App ab. Um einen Absturz zu vermeiden, gibt es Aktivitäten, die resolveActivity () für das Intent-Objekt verwenden und Intent verwenden, wenn das Ergebnis nicht null ist. Wenn null, deaktivieren Sie die Ausgabe von Intent, um einen Absturz zu vermeiden. Der folgende Code ist ein Beispiel. In diesem Beispiel wird der zusätzliche Inhalt angegeben, indem der Datentyp "Absicht" ohne Verwendung des URI deklariert wird.

python


//Generieren Sie eine Textnachricht mit einer Zeichenfolge
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT,textMessage);
sendIntent.setType("text/plain");

//Überprüfen Sie, ob es eine Aktivität gibt, die Intent verwendet
if(sendIntent.resolbeActivity(getPackageManager()) !=null){
   startActivity(sendIntent);
}

Wenn startActivity () aufgerufen wird, überprüft das System alle installierten Apps und ermittelt, welche Apps diese Art von Absicht verarbeiten können. Die Absicht muss über die Aktion ACTION_SEND </ font> und den Datensatz "text / plain" verfügen. Wenn es mehrere solcher Aktivitäten gibt, lassen Sie den Benutzer die Aktivität auswählen, die im Dialogfeld (Tuser-Dialogfeld) gestartet werden soll.

App-Auswahlanzeige

Wenn mehrere Apps auf eine implizite Absicht reagieren, wählt der Benutzer die App aus und macht sie zur Standardauswahl für Aktionen. Das Festlegen von Standardoptionen ist nützlich, wenn der Benutzer jedes Mal dieselbe App auswählt.

Wenn jedoch mehrere Apps auf die Absicht reagieren und der Benutzer möglicherweise jedes Mal eine andere App verwendet, zeigen Sie das Auswahldialogfeld explizit an (die Standard-App für die Aktion kann nicht ausgewählt werden).

Wenn eine App eine "Freigabe" mit einer ACTION_SEND </ font> -Aktion ausführt, möchte der Benutzer je nach Situation möglicherweise eine andere Freigabe verwenden. Verwenden Sie immer einen Auswahldialog wie den folgenden. alt

Tuser-Anzeigecode

Erstellen Sie eine Absicht mit createChooser () </ font> und übergeben Sie sie an startActivity () </ font>. Der folgende Code zeigt in einem Dialogfeld eine Liste von Apps an, die auf die Absicht reagieren, die an die Methode createChooser () </ font> übergeben wurde. Verwenden Sie den angegebenen Text für den Titel des Dialogfelds.

python


Intent sendIntent = new Intent(Intent.ACTION_SEND);
...

// "Verwenden Sie diese ●● App"Mit diesem Gefühl
//Verwenden Sie Zeichenfolgenressourcen für UI-Text
String title = getResources().getString(R.string.chooser_title);

//Generieren Sie eine Absicht, die das Auswahldialogfeld anzeigt
Intent chooser = Intent.createChooser(sendIntent,title);

//Implizite Absicht erfordert das Vorhandensein einer antwortenden Aktion
//Überprüfen Sie, ob eine Aktion zu reagieren ist
if(sendIntent.sesolveActivity(getPackageManager())!=null){
   startActivity(chooser);
}

Erhalten Sie eine implizite Absicht

Um die implizite Absicht anzukündigen, die Ihre App empfangen kann, verwenden Sie das Element </ font> in der Manifestdatei , um einen oder mehrere Absichtsfilter für jede App-Komponente zu filtern. Erklären. Jeder Absichtsfilter gibt den Typ der Absicht an, die er akzeptiert, abhängig von den Aktionen, Daten und Kategorien der Absicht. Das System liefert eine implizite Absicht nur dann an seine App-Komponenten, wenn die Absicht einen der Absichtsfilter besteht.

Explizite Absicht wird immer an die Zielkomponente gesendet, unabhängig vom von der Komponente deklarierten Absichtsfilter.

Die App-Komponente deklariert einen Filter einzeln für jeden einzelnen auszuführenden Job. Wenn beispielsweise eine Aktivität der Bildergalerie-App über zwei Filter verfügt, einen zum Anzeigen des Bildes und einen zum Bearbeiten, wird beim Starten dieser Aktivität zu den Informationen in der Absicht zurückgekehrt und das Bild angezeigt oder bearbeitet. Entscheiden Sie, welche Aktion Sie auswählen möchten.

Jeder Intent-Filter wird im </ font> -Element der Manifestdatei der App definiert und entspricht der App-Komponente ( <) Verschachteln Sie in Aktivitätselementen </ font> usw.). Verwenden Sie in </ font> eines oder mehrere der folgenden drei Elemente und geben Sie den zu akzeptierenden Intent-Typ an.

  • \ </ font> </ strong>
    Deklarieren Sie im Attribut name die Aktion der Absicht, die akzeptiert werden soll. Der Wert sollte die Literalzeichenfolge der Aktion sein ("Verwenden Sie diese ●● Aktion").

  • \ </ font> </ strong>
    Daten-URI (Schema / Host / Port / Pfad) und ein oder mehrere Attribute verschiedener MIME-Typen Verwenden Sie diese Option, um den zu akzeptierenden Datentyp zu deklarieren.

  • \ </ font> </ strong>
    Geben Sie im Attribut name die Kategorie Intent an, die akzeptiert werden soll. Der Wert ist die Literalzeichenfolge der Aktion.

    Um eine implizite Absicht zu erhalten, fügen Sie die Kategorie CATEGORY_DEFAULT </ strong> in den Intent-Filter ein. Die Methoden
    startActivity () </ strong> und startActivityForResult () </ strong> verarbeiten alle Absichten so, als würden sie eine Kategorie CATEGORY_DEFAULT </ strong> deklarieren. Machen. Wenn der Intent-Filter keine CATEGORY_DEFAULT </ strong> -Kategorie deklariert, wird festgestellt, dass keine Aktivität auf die implizite Absicht </ font> </ table> reagiert

    Die Aktivitätsdeklaration des Intent-Filters, der ACTION_SEND </ font> Intent empfängt, wenn der Datentyp Text ist, ist unten dargestellt.

    manifest.java

    
    <activity ancroid:name="ShareActivity">
      <intent-filter>
        <action   ancroid:name     = "android.intent.action.SEND"/>
        <category android:name     = "android.intent.category.DEFAULT"/>
        <data     android:mimeType = "text/plain"/>
      </intent-filter>
    </activity>
    

    Sie können einen Filter erstellen, der zwei oder mehr von \ \ \ </ font> enthält. Zu diesem Zeitpunkt müssen Sie sicherstellen, dass die Komponente eine beliebige Kombination dieser Filterelemente </ font> verarbeiten kann.

    Wenn Sie mehrere Arten von Absichten unterstützen und nur bestimmte Kombinationen von Aktionsdatenkategorietypen </ strong> verarbeiten möchten, müssen Sie mehrere Absichtsfilter erstellen.

    Die implizite Absicht wird bestimmt, um jedes dieser drei Elemente und die Absicht gegen einen Filter anzupassen. Wenn der Intent die Konformitätsbeurteilung aller drei Elemente besteht, wird der Intent an die Komponente geliefert. Wenn auch nur eine nicht übereinstimmt, liefert das Android-System die Absicht nicht. Wenn jedoch mehrere Absichtsfilter für eine Komponente festgelegt sind, kann einer der Filter übergeben werden.

    VORSICHT: Absichtsfilter können gefährlich sein, um zu verhindern, dass andere Apps die Komponenten Ihrer App verwenden. Der Absichtsfilter beschränkt eine Komponente darauf, nur auf bestimmte Arten impliziter Absichten zu reagieren. Wenn jedoch eine andere App eine Komponente für ihre App angibt und eine explizite Absicht verwendet, kann die Komponente gestartet werden. Es gibt Sex. Um zu verhindern, dass es von einer anderen App verwendet wird, setzen Sie das exportierte Attribut der Komponente auf "false", anstatt den Intent-Filter im Manifest .
    Starten Sie Ihren Dienst immer mit einer expliziten Absicht, um zu vermeiden, dass die Dienste anderer Apps versehentlich ausgeführt werden.
    Deklarieren Sie einen Absichtsfilter in der Manifestdatei für alle Aktivitäten. Broadcast-Empfängerfilter können jedoch dynamisch registriert werden, indem registerReceiver () aufgerufen wird. Verwenden Sie dann unregisterReceiver () , um die Registrierung des Empfängers aufzuheben. Auf diese Weise kann die App eine bestimmte Sendung für einen bestimmten Zeitraum abhören, während die App ausgeführt wird.
    Filterbeispiel

    Die Funktionsweise des Intent-Filters wird am Beispiel der Manifestdatei der Social-Sharing-Anwendung erläutert.

    python

    
    <activity android:name="MainActivity">
        <!--Hauptaktivität zum Starten der App über den Launcher-->
        <intent-filter>
            <action   android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    
    <activity android:name="ShareActivity">
        <!--Aktivitäten, die den Prozess des Sendens von Textdaten behandeln-->
        <intent-filter>
            <action   android:name    ="android.intent.action.SEND"/>
            <category android:name    ="android.intent.category.DEFAULT"/>
            <data     android:mimeType="text/plain"/>
        </intent-filter>
        <!--Aktivität zum Senden von Mediendaten-->
        <intent-filter>
            <action   android:name="android.intent.action.SEND"/>
            <action   android:name="android.intent.action.SEND_MULTIPLE"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <data     android:mimeType="application/vnd.google.panorama360+jpg"/>
            <data     android:mimeType="image/*"/>
            <data     android:mimeType="video/*"/>
        </intent-filter>
    </activity>
    

    Der erste Absichtsfilter ist die Hauptaktivität, die Aktivität, die geöffnet wird, wenn der Benutzer die App zum ersten Mal über das Startsymbol startet.

    • ACTION_MAIN </ font> </ strong> Aktion
      Der Haupteinstiegspunkt zeigt an, dass keine Absichtsdaten vorhanden sind.
    • CATEGORY_LAUNCHER </ font> </ strong> Kategorie
      Gibt an, dass das Symbol für diese Aktivität im App-Launcher des Systems platziert werden soll. -Wenn das Element \ <Aktivität> </ font> ein Symbol ist und kein Symbol angegeben ist, verwendet das System das Element \ </ font>. Verwenden Sie das Symbol.

    Koppeln Sie die beiden, um diese Aktivität im App Launcher anzuzeigen.

    Die zweite Aktivität, "ShareActivity", erleichtert das Teilen von Text- und Medieninhalten. Der Benutzer kann diese Aktivität durch Navigieren von "MainActivity" aus aufrufen, gibt jedoch eine implizite Absicht aus, die mit einem der beiden Absichtsfilter (Textdaten-Absichtsfilter oder Mediendaten-Absichtsfilter) übereinstimmt. Sie können "ShareActivity" auch direkt von einer anderen App aus eingeben.

    Der MIME-Anwendungstyp / vnd.google.panorama360 + jpg ist ein spezieller Datentyp, der ein Panoramafoto angibt und von der Google Panorama-API verarbeitet wird.

    Verwenden Sie PendingIntent

    Das PendingIntent </ font> -Objekt ist ein Wrapper für das Intent-Objekt. Der Hauptzweck besteht darin, einer anderen App die Berechtigung zu erteilen, die enthaltene Absicht so zu verwenden, als ob sie während des Entwicklungsprozesses der App ausgeführt worden wäre.

    Hauptanwendungsfälle von PendingIntent

    Ausstehend bedeutet ausstehend. Es ist, als würde man Intent irgendwann verwenden, anstatt es sofort zu verwenden.

    • Verwenden Sie Benachrichtigungen, um die Absicht zu deklarieren, die verwendet werden soll, wenn der Benutzer eine Aktion ausführt (Notification Manager auf einem Android-System führt die Absicht aus).

    --Verwenden Sie das Widget der App, um die Absicht zu deklarieren, die verwendet werden soll, wenn der Benutzer eine Aktion ausführt (die Startbildschirm-App führt die Absicht aus).

    --Erläutern Sie eine Absicht für eine Aktion, die zu einem bestimmten Zeitpunkt in der Zukunft ausgeführt werden soll (AlarmManager auf dem Android-System führt Absicht aus).

    Da davon ausgegangen wird, dass jedes Intent-Objekt von einem bestimmten Komponententyp der Anwendung verarbeitet wird, wird PendingIntent unter derselben Annahme erstellt. Wenn PendingIntent verwendet wird, führt die zu entwickelnde Anwendung Intent nicht durch Aufrufen von startActivity () </ font> aus. Rufen Sie stattdessen die folgende Generierungsmethode auf, um den gewünschten Komponententyp beim Erstellen des PendingIntent zu deklarieren.

    • Absicht, Aktivität zu starten </ font> </ strong>
      PendingInten.getActivity ()
    • Absicht, Service zu starten </ font> </ strong>
      PendingIntent.getService ()
    • BroadcastReceiver Intent starten </ font> </ strong>
      PendingIntent.getBroadcast ()

    Sofern die von Ihnen entwickelte App kein PendingIntent von einer anderen App erhält, sind die beim Erstellen eines PendingIntent erforderlichen PendingIntent-Methoden fast die oben genannten drei (es gibt auch getActivities (Context, int, Intent [], int)).

    Jede Methode erhält einen Kontext </ font> für die aktuelle App, die Absicht, die Sie umbrechen möchten, und ein oder mehrere Flags (ob die Absicht mehrmals verwendet werden kann), die angeben, wie die Absicht verwendet werden soll.

    PendingIntent developers Eine Beschreibung der von PendingIntent ausgeführten Absichten und Aktionen. Erstellen Sie eine Instanz der PendingIntent-Klasse mit der folgenden Methode.

    - getActivity(Context,int,Intent,int) - getActivities(Context,int,Intent,int) - getBroadcast(Context,int,Intent,int) - getService(Context,int,Intent,int)

    Argumentbeschreibung </ strong> getActivity (Aktivität gestartet mit PendingInten, PendingIntent-Quellcode, Ausführungsabsicht, Flag)

    Die erstellte PendingIntent-Instanz dient dazu, andere Anwendungen nachträglich auszuführen. Wenn PendingIntent an eine andere App übergeben wird, erhält die übergebene App dieselbe Ausführungsberechtigung wie die Distributionsquellen-App selbst (es wird festgestellt, dass sie dieselbe Berechtigung und ID hat). Daher müssen Sie beim Generieren von PendingIntent vorsichtig sein. Wenn Sie beispielsweise eine grundlegende Absicht ausgeben, wird ein expliziter Komponentenname angegeben, damit die Absicht fehlerfrei an die Ausgabezielkomponente übermittelt werden kann. (Geben Sie dem falschen Lieferziel keine wichtigen Berechtigungen.)

    Weitere Informationen zur Verwendung von PendingIntent finden Sie in den folgenden Verwendungsbeispielen.

    https://developer.android.com/guide/topics/ui/notifiers/notifications.html?hl=ja https://developer.android.com/guide/topics/appwidgets/index.html?hl=ja

    Implizite Beurteilung der Inten-Antwort

    Wenn das System eine implizite Absicht empfängt, die eine Aktivität initiiert, vergleicht es die Absicht mit dem Absichtsfilter, um die beste Aktivität für die Absicht zu finden.

    • Action --data (sowohl URI als auch Datentyp)
    • category

    Test der impliziten Absichtsaktion

    Um anzugeben, welche Intent-Aktionen akzeptiert werden sollen, deklarieren Sie null oder mehr \ </ font> -Elemente im Intent-Filter.

    python

    
    <intent-filter>
      <action android:name="android.intent.action.EDIT"/>
      <action android:name="android.intent.action.VIEW"/>
      ...
    </intent-filter>
    

    Um diesen Filter zu bestehen, muss die von Intent angegebene Aktion mit der beliebigen </ font> -Aktion übereinstimmen, die von \ angegeben wird.

    Wenn die Liste der Filter keine Aktionen enthält (\ ~ </ intent-filter>), stimmt die Absicht nicht überein und alle Absichten können den Test nicht bestehen. Wenn der Filter jedoch eine oder mehrere Aktionen hat, wenn der Intent keine Aktion angibt, besteht der Test.

    Test der impliziten Absichtskategorie

    Wenn Sie eine Kategorie angeben, deklarieren Sie 0 oder mehr \ </ font> -Elemente im Intent-Filter.

    python

    
    <intent-filter>
      <category android:name="android.intent.category.DEFAULT"/>
      <category android:name="android.intent.category.BROWSABLE"/>
      ...
    </intent-filter>
    

    Alle Kategorien von Intent müssen mit den Kategorien im Filter übereinstimmen, damit Intent den Kategorietest besteht. Wenn vom Intent-Filter mehr Kategorien als die von Intent angegebenen Kategorien angegeben werden, wird Intent möglicherweise übergeben. Beispielsweise besteht eine Absicht ohne Kategorie den Test immer, unabhängig von der im Filter deklarierten Kategorie.

    Automatische Kategorie CATEGORY_DEFAULLT für alle impliziten Absichten, die an startActivity () und startActivityForResult () übergeben werden Anpassen Wenn Ihre Aktivität eine implizite Absicht erhalten soll, fügen Sie die Kategorie "android.intent.category.DEFAULT" in \ ein Muss enthalten sein .

    Impliziter Absichtsdatentest

    Wenn Sie die zu akzeptierenden Intent-Daten angeben möchten, deklarieren Sie im Intent-Filter null oder mehr \ </ font> -Elemente.

    python

    
    <intent-filter>
      <data android:mimeType="video/mpeg" android:scheme="http" .../>
      <data android:mimeType="audio/mpeg" android:scheme="http" .../>
      ///
    </intent-filter>
    

    Mit jedem -Element können Sie die URI-Struktur und den Datentyp (MIME-Medientyp) angeben. Der URI besteht aus vier Attributen: Schema-Host-Port-Pfad </ font> (siehe unten).

    <scheme>://<host>:<port>/<path>

    Das folgende Beispiel beschreibt mögliche Werte für diese Attribute.

    content://com.example.project:200/folder/subfolder/etc

    In dieser URI lautet das Schema "content", der Host "com.example.project", der Port "200" und der Pfad "folder / subfolder / etc".

    Jedes dieser Attribute kann im Element \ </ font> weggelassen werden. Es besteht jedoch eine primäre Abhängigkeit.

    • Ignorieren Sie den Host, wenn kein Schema angegeben ist
    • Wenn kein Host angegeben ist, wird der Port ignoriert
    • Ignorieren Sie den Pfad, wenn sowohl das Schema als auch der Host nicht angegeben sind

    Beim Vergleich des URI des Intents mit der URI-Spezifikation des Filters wird nur ein Teil des im Filter enthaltenen URI verglichen.

    • Wenn im Filter nur ein Schema angegeben ist, stimmen alle Filter mit diesem Schema überein.
    • Wenn das Filterschema und der Host angegeben sind und kein Pfad angegeben ist, bestehen alle URIs mit demselben Schema und Host den Filter.
    • Wenn der Filter Schema, Host, Pfad angibt, passieren nur URIs mit demselben Schema, Host, Pfad den Filter.
    Gemäß der Pfadspezifikation kann nur eine teilweise Übereinstimmung des Pfadnamens einschließlich des Platzhalter-Sternchens (*) angefordert werden.

    Der Datentest vergleicht sowohl den URI- als auch den MIME-Typ des Intents mit den im Filter angegebenen Werten. Die Regeln oder wie folgt.

    --Intents ohne URI- oder MIME-Typ können den Test nur bestehen, wenn der Filter keinen URI- oder MIME-Typ angibt. --Wenn der URI angegeben ist und der MIME-Typ nicht angegeben ist Absicht (der Typ ist nicht angegeben und kann nicht aus dem URI abgeleitet werden), wird der Test nur durchgeführt, wenn der URI mit dem URI-Format des Filters übereinstimmt und der Filter den MIME-Typ nicht angibt. Bestehen

    • Wenn der URI nicht angegeben und der MIME-Typ angegeben ist, besteht der Test nur, wenn die Filterliste denselben MIME-Typ hat und das URI-Format nicht angegeben ist.
    • Bestehen Sie für Absichten mit einem angegebenen URI und MIME-Typ (explizit, aus dem URI abgeleitet) den MIME-Typentest nur, wenn der MIME-Typ mit dem Typ in der Filterliste übereinstimmt.
      Der URI-Test besteht den Test, wenn er mit dem Filter-URI übereinstimmt oder wenn der Intent Inhalt: URI oder Datei: URI enthält und der Filter den URI nicht angibt.
      Wenn der Filter nur MIME-Typen auflistet, wird davon ausgegangen, dass die Komponente content: data und file: data unterstützt.
    Wenn der Intent einen URI- oder MIME-Typ angibt, schlägt der Datentest fehl, wenn sich in \ kein -Element befindet td>

    Die letzte Regel geht davon aus, dass die Komponente lokale Daten von Dateien und Inhaltsanbietern abrufen kann. Der Filter listet nur die Datentypen auf, und es ist nicht erforderlich, den Inhalt: Schema oder Datei: Schema explizit anzugeben. Das folgende Beispiel ist ein typischer Code, der zeigt, dass das -Element auf Androido zugreifen kann und die Komponente die Bilddaten vom Inhaltsanbieter abrufen und anzeigen kann.

    python

    
    <intent-filter>
      <data android:mimeType="image/*"/>
      ...
    </intent-filter>
    

    Die meisten verfügbaren Daten werden vom Inhaltsanbieter bereitgestellt (gemeinsame Nutzung von Informationen, eine Schnittstelle zum Verbinden von Daten innerhalb eines Prozesses mit Code, der in einem anderen Prozess ausgeführt wird). Geben Sie daher den Datentyp und den URI an. Die nicht angegebene Methode wird häufig verwendet (der Inhaltsanbieter kann die erforderlichen Daten häufig durch Angabe des Datentyps identifizieren).

    Eine andere übliche Konfiguration ist ein Filter, der das Schema und den Datentyp beschreibt. Das folgende -Element definiert beispielsweise Android, um Videodaten (video / _ * "aus dem Komponentennetzwerk (Schema =" http ") abzurufen und eine Aktion auszuführen.

    python

    
    <intent-filter>
      <data android:scheme="http" android:mimeType="video/*"/>
      ...
    </intent-filter>
    

    Mit Absicht übereinstimmen

    Das Abgleichen der Absicht mit dem Absichtsfilter hat die Funktion, nach der zu startenden Zielkomponente zu suchen und nach Informationen über einige Komponenten auf dem Terminal zu suchen. Die Home-App findet beispielsweise alle Aktivitäten mit einem Absichtsfilter, der die Aktion ACTION_MAIN </ font> und die Kategorie VATEGORY_LUNCHER </ font> angibt. Geben Sie dann die Daten in den App-Launcher ein (registrieren Sie die App bei der Komponente, die im Launcher gestartet werden kann). Die Übereinstimmung wird nur hergestellt, wenn die Absichtsaktion und die Kategorie den Filtertest bestehen.

    Die App, die Sie entwickeln, kann auf die gleiche Weise wie die Heim-App mit Absichten übereinstimmen. PackageManager verfügt über eine query ... () -Methode und eine resolve ... () -Methode. Die Methode query ... () stellt alle Komponenten bereit, die die Absicht empfangen können, und die Methode resolve ... () bestimmt die beste Komponente, um auf die Absicht zu antworten. Beispielsweise stellt queryIntentActivities () alle Aktivitäten bereit, die das Argument Intent ausführen können, und queryIntentService () bietet eine Liste ähnlicher Dienste. Keine der beiden Methoden startet eine Komponente, sondern liefert nur eine Liste. Broadcast-Empfänger haben eine ähnliche Methode, queryBroadcastReceivers ().

    Allgemeine Absicht

    Alarmsperre

    Kalender

    Kamera

    Kontakt / Kontaktbuch App

    Email

    Dateispeicher

    Lokale Aktion

    Karte

    Musik-Video

    Neue Notiz

    Telefon

    Suche

    Aufbau

    Textnachricht

    Webbrowser

    Absichtsüberprüfung mit Android Debug Bridge

    Beispielcode (von unten dereferenziert)

    Verfassung

    Project Faile Aufbau
    Project01 Manifest.java Aktivität registrieren Subaktivität
    <Intent-filter>Der Satz
    MainActivity.java Button Listener
    activity_main.xml Platziere zwei Knöpfe
    SubActivity.java
    activity_sub.xml TextView "Project01 SubActivity"
    Project02 Manifest.java Aktivität Hauptaktivität
    <Intent-filter>Der Satz
    MainActivity.java
    activity_main.xml TextView "Project02 MainActivity"

    Project01

    Manifest.java

    Manifest.java

    
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
    
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    
    //■■■ Hinzufügen ↓ ■■■
    <activity android:name=".SubActivity">
        <intent-filter>
            <action android:name="sub_activity"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
    </activity>
    //■■■ Bis hierher ■■■
    

    MainActivity-Layout (activity_main.xml)

    activity_main.xml

    
    <Button
       android:id="@+id/button01"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="Button01"
       />
    <Button
       android:id="@+id/button02"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="Button02"
       />
    

    MainActivity.java

    MainActivity.java

    
    @Override 
    protected void onCreate(Bundle savedInstanceState){
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
    
       Button button01 = findViewById(R.id.button01);
       Button button02 = findViewById(R.id.button02);
    
       button01.setOnClickListener(new View.OnClickListener(){
          @Override 
          public void onClick(View v){
             Intent intent_sub = new Intent("sub_activity");
             startActivity(intent_sub);
          }
       });
    
       button02.setOnClickListener(new View.OnClickListener(){
          @Override 
          public void onClick(View v){
             Intent intent_pro02_main = new Intent("pro02_main_activity");
             startActivity(intent_pro02_main);
          }
       });
    }
    

    SubAktivitätslayout

    activity_sub.xml

    
    <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="SubActivity in Project01"/>
    

    SubActivity.java macht nichts

    Project02

    Manifest.java

    Manifest.java

    
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
    
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    
        //■■■ Hinzufügen ↓ ■■■
        <intent-filter>
            <action android:name="pro02_main_activity"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
        //■■■ Bis hierher ■■■
    </activity>
    

    Hauptaktivitätslayout

    activity_main.xml

    
    <TextView
       android:text="MainActivity in Project02"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       />
    

    MainActivity.java macht nichts

    Recommended Posts