Android - intencje i filtry

Android Intentto abstrakcyjny opis operacji do wykonania. Może być używany zstartActivity aby uruchomić działanie, broadcastIntent aby wysłać go do wszystkich zainteresowanych komponentów BroadcastReceiver i startService(Intent) lub bindService(Intent, ServiceConnection, int) do komunikacji z usługą w tle.

The intent itself, an Intent object, is a passive data structure holding an abstract description of an operation to be performed.

Na przykład załóżmy, że masz działanie, które wymaga uruchomienia klienta poczty e-mail i wysłania wiadomości e-mail za pomocą urządzenia z systemem Android. W tym celu Twoja aktywność wyśle ​​ACTION_SEND wraz z odpowiednimichooser, do mechanizmu rozpoznawania zamiarów Androida. Określony selektor zapewnia użytkownikowi odpowiedni interfejs do wyboru sposobu wysyłania danych e-mail.

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..."));

Powyższa składnia wywołuje metodę startActivity w celu uruchomienia aktywności e-mail, a wynik powinien wyglądać tak, jak pokazano poniżej -

Załóżmy na przykład, że masz działanie, które musi otworzyć adres URL w przeglądarce internetowej na urządzeniu z systemem Android. W tym celu Twoja aktywność wyśle ​​ACTION_WEB_SEARCH zamiar do narzędzia do rozpoznawania intencji Androida, aby otworzyć podany adres URL w przeglądarce internetowej. Rozpoznawanie intencji analizuje listę działań i wybiera to, które najlepiej pasuje do celu, w tym przypadku jest to działanie przeglądarki internetowej. Intent Resolver przekazuje następnie twoją stronę internetową do przeglądarki internetowej i uruchamia działanie przeglądarki internetowej.

String q = "tutorialspoint";
Intent intent = new Intent(Intent.ACTION_WEB_SEARCH );
intent.putExtra(SearchManager.QUERY, q);
startActivity(intent);

Powyższy przykład wyszuka jako tutorialspoint w wyszukiwarce android i daje wynik tutorialspoint w twojej działalności

Istnieją oddzielne mechanizmy dostarczania intencji do każdego typu komponentu - działań, usług i odbiorników transmisji.

Sr.No Metoda i opis
1

Context.startActivity()

Obiekt Intent jest przekazywany do tej metody w celu uruchomienia nowego działania lub pobrania istniejącego działania do wykonania czegoś nowego.

2

Context.startService()

Obiekt Intent jest przekazywany do tej metody w celu zainicjowania usługi lub dostarczenia nowych instrukcji do trwającej usługi.

3

Context.sendBroadcast()

Obiekt Intent jest przekazywany do tej metody, aby dostarczyć wiadomość do wszystkich zainteresowanych odbiorników transmisji.

Obiekty intencji

Obiekt intencji to zbiór informacji, z których korzysta komponent odbierający intencję, a także informacje używane przez system Android.

Obiekt intencji może zawierać następujące komponenty w zależności od tego, co komunikuje lub zamierza wykonać -

Akcja

Jest to obowiązkowa część obiektu Intent i jest ciągiem określającym akcję do wykonania - lub, w przypadku intencji rozgłoszeniowych, akcję, która miała miejsce i jest raportowana. Akcja w dużej mierze decyduje o strukturze pozostałej części obiektu intencji. Klasa Intent definiuje szereg stałych akcji odpowiadających różnym intencjom. Oto lista standardowych działań dotyczących zamiarów Androida

Akcję w obiekcie Intent można ustawić za pomocą metody setAction () i odczytać za pomocą metody getAction ().

Dane

Dodaje specyfikację danych do filtru intencji. Specyfikacja może być tylko typem danych (atrybut mimeType), tylko identyfikatorem URI lub zarówno typem danych, jak i identyfikatorem URI. Identyfikator URI jest określony przez osobne atrybuty dla każdej jego części -

Te atrybuty określające format adresu URL są opcjonalne, ale także zależne od siebie -

  • Jeśli schemat nie jest określony dla filtru intencji, wszystkie inne atrybuty URI są ignorowane.
  • Jeśli dla filtru nie określono hosta, atrybut portu i wszystkie atrybuty ścieżki są ignorowane.

Metoda setData () określa dane tylko jako URI, setType () określa je tylko jako typ MIME, a setDataAndType () określa je jako typ URI i MIME. Identyfikator URI jest odczytywany przez getData (), a typ przez getType ().

Niektóre przykłady par akcja / dane to -

Sr.No. Działanie / para danych i opis
1

ACTION_VIEW content://contacts/people/1

Wyświetl informacje o osobie, której identyfikator to „1”.

2

ACTION_DIAL content://contacts/people/1

Wyświetl dialer telefonu z wpisaną osobą.

3

ACTION_VIEW tel:123

Wyświetl dialer telefonu z wypełnionym podanym numerem.

4

ACTION_DIAL tel:123

Wyświetl dialer telefonu z wypełnionym podanym numerem.

5

ACTION_EDIT content://contacts/people/1

Edytuj informacje o osobie, której identyfikator to „1”.

6

ACTION_VIEW content://contacts/people/

Wyświetl listę osób, które użytkownik może przeglądać.

7

ACTION_SET_WALLPAPER

Pokaż ustawienia wyboru tapety

8

ACTION_SYNC

Będzie to synchronizacja danych, czyli Constant Value android.intent.action.SYNC

9

ACTION_SYSTEM_TUTORIAL

Uruchomi samouczek zdefiniowany na platformie (samouczek domyślny lub samouczek dotyczący uruchamiania)

10

ACTION_TIMEZONE_CHANGED

Wskazuje, kiedy zmieniła się strefa czasowa

11

ACTION_UNINSTALL_PACKAGE

Służy do uruchamiania domyślnego deinstalatora

Kategoria

Kategoria jest opcjonalną częścią obiektu Intent i jest to ciąg znaków zawierający dodatkowe informacje o rodzaju składnika, który powinien obsługiwać intencję. Metoda addCategory () umieszcza kategorię w obiekcie Intent, removeCategory () usuwa kategorię wcześniej dodaną, a getCategories () pobiera zestaw wszystkich kategorii znajdujących się obecnie w obiekcie. Oto lista standardowych kategorii intencji Androida .

Możesz sprawdzić szczegóły dotyczące filtrów intencji w poniższej sekcji, aby zrozumieć, w jaki sposób używamy kategorii, aby wybrać odpowiednią aktywność odpowiadającą intencji.

Dodatki

Będą to pary klucz-wartość dla dodatkowych informacji, które należy dostarczyć do komponentu obsługującego intencję. Dodatki można ustawiać i odczytywać odpowiednio za pomocą metod putExtras () i getExtras (). Oto lista dodatkowych danych Android Intent Standard

Flagi

Te flagi są opcjonalną częścią obiektu Intent i instruują system Android, jak uruchomić działanie i jak je traktować po uruchomieniu itp.

Sr.No Flagi i opis
1

FLAG_ACTIVITY_CLEAR_TASK

Jeśli zostanie ustawiona w intencji przekazanej do Context.startActivity (), ta flaga spowoduje, że wszelkie istniejące zadanie, które byłoby skojarzone z działaniem, zostanie wyczyszczone przed rozpoczęciem działania. Oznacza to, że działanie staje się nowym źródłem pustego zadania, a wszelkie stare działania są zakończone. Można tego używać tylko w połączeniu z FLAG_ACTIVITY_NEW_TASK.

2

FLAG_ACTIVITY_CLEAR_TOP

Jeśli jest ustawiona, a uruchamiana czynność jest już uruchomiona w bieżącym zadaniu, to zamiast uruchamiania nowej instancji tej czynności, wszystkie pozostałe działania na niej zostaną zamknięte, a ta intencja zostanie dostarczona do (teraz do góry) stara aktywność jako nowa intencja.

3

FLAG_ACTIVITY_NEW_TASK

Ta flaga jest zwykle używana przez działania, które chcą prezentować zachowanie w stylu „programu uruchamiającego”: dają użytkownikowi listę oddzielnych rzeczy do wykonania, które w przeciwnym razie działają całkowicie niezależnie od działania, które je uruchamia.

Nazwa komponentu

To opcjonalne pole to android ComponentNameobiekt reprezentujący klasę Activity, Service lub BroadcastReceiver. Jeśli jest ustawiona, obiekt Intent jest dostarczany do wystąpienia wyznaczonej klasy, w przeciwnym razie system Android używa innych informacji w obiekcie Intent do zlokalizowania odpowiedniego celu.

Nazwa komponentu jest ustawiana przez setComponent (), setClass () lub setClassName () i odczytywana przez getComponent ().

Rodzaje intencji

Istnieją dwa typy intencji obsługiwane przez Androida

Wyraźne zamiary

Wyraźna intencja będzie połączona z wewnętrznym światem aplikacji, przypuśćmy, że jeśli chcesz połączyć jedno działanie z innym, możemy zrobić ten cytat z wyraźnym zamiarem, poniżej obraz łączy pierwszą czynność z drugą czynnością, klikając przycisk.

Te intencje określają komponent docelowy za pomocą jego nazwy i są zwykle używane w przypadku komunikatów wewnętrznych aplikacji - takich jak działanie uruchamiające usługę podrzędną lub uruchamianie działania siostrzanego. Na przykład -

// Explicit Intent by specifying its class name
Intent i = new Intent(FirstActivity.this, SecondActivity.class);

// Starts TargetActivity
startActivity(i);

Ukryte zamiary

Te intencje nie określają celu, a pole na nazwę komponentu jest puste. Niejawne intencje są często używane do aktywowania komponentów w innych aplikacjach. Na przykład -

Intent read1=new Intent();
read1.setAction(android.content.Intent.ACTION_VIEW);
read1.setData(ContactsContract.Contacts.CONTENT_URI);
startActivity(read1);

Powyższy kod da wynik, jak pokazano poniżej

Komponent docelowy, który otrzymuje intencję, może używać rozszerzenia getExtras()metoda, aby uzyskać dodatkowe dane wysłane przez komponent źródłowy. Na przykład -

// Get bundle object at appropriate place in your code
Bundle extras = getIntent().getExtras();

// Extract data using passed keys
String value1 = extras.getString("Key1");
String value2 = extras.getString("Key2");

Przykład

Poniższy przykład przedstawia funkcjonalność systemu Android Intent do uruchamiania różnych wbudowanych aplikacji systemu Android.

Krok Opis
1 Użyjesz Android Studio IDE do stworzenia aplikacji na Androida i nazwij ją jako Moja aplikacja w pakiecie com.example.saira_000.myapplication .
2 Zmodyfikuj plik src / main / java / MainActivity.java i dodaj kod definiujący dwa odbiorniki odpowiadające dwóm przyciskom, tj. Uruchom przeglądarkę i telefon.
3 Zmodyfikuj plik XML układu res / layout / activity_main.xml, aby dodać trzy przyciski w układzie liniowym.
4 Uruchom aplikację, aby uruchomić emulator Androida i zweryfikować wynik zmian wprowadzonych w aplikacji.

Poniżej znajduje się zawartość zmodyfikowanego pliku głównego działania src/com.example.My Application/MainActivity.java.

package com.example.saira_000.myapplication;

import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
   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("http://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);
         }
      });
   }
}

Poniżej będzie treść res/layout/activity_main.xml plik -

<?xml version="1.0" encoding="utf-8"?>
<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="Intent Example"
      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_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/abc"
      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="Start Browser"
      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="Start Phone"
      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>

Poniżej będzie treść res/values/strings.xml zdefiniować dwie nowe stałe -

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <string name="app_name">My Applicaiton</string>
</resources>

Poniżej znajduje się domyślna zawartość AndroidManifest.xml -

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.saira_000.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>
   </application>
</manifest>

Spróbujmy uruchomić Twój My Applicationpodanie. Zakładam, że stworzyłeś swójAVDpodczas konfigurowania środowiska. Aby uruchomić aplikację z Android Studio, otwórz jeden z plików aktywności projektu i kliknij

ikonę Uruchom na pasku narzędzi.Android Studio instaluje aplikację na Twoim AVD i uruchamia ją, a jeśli wszystko jest w porządku z konfiguracją i aplikacją, wyświetli się następujący emulator okno -

Teraz kliknij Start Browser przycisk, który uruchomi skonfigurowaną przeglądarkę i wyświetli http://www.example.com, jak pokazano poniżej -

W podobny sposób możesz uruchomić interfejs telefonu za pomocą przycisku Uruchom telefon, który pozwoli Ci na wybranie już podanego numeru telefonu.

Filtry intencji

Widzieliście, jak intencja została użyta do wezwania innej czynności. System operacyjny Android używa filtrów, aby wskazać zestaw odbiorników działań, usług i transmisji, które mogą obsłużyć zamiar za pomocą określonego zestawu działań, kategorii, schematu danych skojarzonego z intencją. Będziesz używać<intent-filter> element w pliku manifestu, aby wyświetlić listę działań, kategorii i typów danych powiązanych z jakąkolwiek aktywnością, usługą lub odbiornikiem transmisji.

Poniżej znajduje się przykład części AndroidManifest.xml plik, aby określić działanie com.example.My Application.CustomActivity które można wywołać za pomocą jednej z dwóch wymienionych akcji, jednej kategorii i jednej danych -

<activity android:name=".CustomActivity"
   android:label="@string/app_name">
   
   <intent-filter>
      <action android:name="android.intent.action.VIEW" />
      <action android:name="com.example.My Application.LAUNCH" />
      <category android:name="android.intent.category.DEFAULT" />
      <data android:scheme="http" />
   </intent-filter>
   
</activity>

Po zdefiniowaniu tej czynności wraz z wyżej wymienionymi filtrami, inne działania będą mogły wywoływać tę aktywność za pomocą rozszerzenia android.intent.action.VIEWlub używając com.example.My Application.LAUNCH pod warunkiem, że ich kategoria to android.intent.category.DEFAULT.

Plik <data> element określa typ danych oczekiwany przez działanie, które ma zostać wywołane, a na przykład w powyższym działaniu niestandardowe działanie oczekuje, że dane będą rozpoczynać się od „http: //”

Może zaistnieć sytuacja, w której intencja może przejść przez filtry więcej niż jednej czynności lub usługi, użytkownik może zostać poproszony o aktywację składnika. Wyjątek jest zgłaszany, jeśli nie można znaleźć celu.

Istnieją następujące testy sprawdzające system Android przed wywołaniem działania:

  • Filtr <intent-filter> może zawierać więcej niż jedną akcję, jak pokazano powyżej, ale ta lista nie może być pusta; filtr musi zawierać co najmniej jeden element <action>, w przeciwnym razie będzie blokował wszystkie intencje. Jeśli wspomniano więcej niż jedną akcję, system Android próbuje dopasować jedną z wymienionych akcji przed wywołaniem działania.

  • Filtr <intent-filter> może zawierać zero, jedną lub więcej niż jedną kategorię. jeśli nie wymieniono żadnej kategorii, system Android zawsze przechodzi ten test, ale jeśli wspomniano więcej niż jedną kategorię, każda kategoria w obiekcie Intent musi pasować do kategorii w filtrze, aby przejść do testu kategorii.

  • Każdy element <data> może określać identyfikator URI i typ danych (typ nośnika MIME). Istnieją oddzielne atrybuty, takie jakscheme, host, port, i pathdla każdej części identyfikatora URI. Obiekt Intent, który zawiera zarówno identyfikator URI, jak i typ danych, przekazuje część testu dotyczącą typu danych tylko wtedy, gdy jego typ jest zgodny z typem wymienionym w filtrze.

Przykład

Poniższy przykład jest modyfikacją powyższego przykładu. Tutaj zobaczymy, jak Android rozwiązuje konflikt, jeśli jedna intencja wywołuje dwie czynności zdefiniowane w, następnie jak wywołać niestandardowe działanie za pomocą filtru, a trzecia jest przypadkiem wyjątkowym, jeśli Android nie zgłosi odpowiedniej aktywności zdefiniowanej dla intencji.

Krok Opis
1 Użyjesz Android Studio do stworzenia aplikacji na Androida i nadaj jej nazwę Moja aplikacja w pakiecie com.example.tutorialspoint7.myapplication; .
2 Zmodyfikuj plik src / Main / Java / MainActivity.java i dodaj kod definiujący trzy odbiorniki odpowiadające trzem przyciskom zdefiniowanym w pliku układu.
3 Dodaj nowy plik src / Main / Java / CustomActivity.java , aby mieć jedno działanie niestandardowe, które będzie wywoływane w różnych celach.
4 Zmodyfikuj plik XML układu res / layout / activity_main.xml, aby dodać trzy przyciski w układzie liniowym.
5 Dodaj jeden plik XML układu res / layout / custom_view.xml, aby dodać prosty <TextView>, aby pokazać przekazane dane przez intencję.
6 Zmodyfikuj plik AndroidManifest.xml, aby dodać element <intent-filter> w celu zdefiniowania reguł dotyczących zamiaru wywoływania działania niestandardowego.
7 Uruchom aplikację, aby uruchomić emulator Androida i zweryfikować wynik zmian wprowadzonych w aplikacji.

Poniżej znajduje się zawartość zmodyfikowanego pliku głównego działania src/MainActivity.java.

package com.example.tutorialspoint7.myapplication;

import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
   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("http://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.
               tutorialspoint7.myapplication.
                  LAUNCH",Uri.parse("http://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.
               My Application.LAUNCH",
                  Uri.parse("https://www.example.com"));
            startActivity(i);
         }
      });
   }
}

Poniżej znajduje się zawartość zmodyfikowanego pliku głównego działania src/com.example.My Application/CustomActivity.java.

package com.example.tutorialspoint7.myapplication;

import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.widget.TextView;

/**
 * Created by TutorialsPoint7 on 8/23/2016.
 */
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());
   }
}

Poniżej będzie treść res/layout/activity_main.xml plik -

<?xml version="1.0" encoding="utf-8"?>
<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:paddingBottom="@dimen/activity_vertical_margin"
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   tools:context="com.example.tutorialspoint7.myapplication.MainActivity">

   <TextView
      android:id="@+id/textView1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Intent Example"
      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_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/abc"
      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="Start Browser"
      android:id="@+id/button"
      android:layout_alignTop="@+id/editText"
      android:layout_alignLeft="@+id/imageButton"
      android:layout_alignStart="@+id/imageButton"
      android:layout_alignEnd="@+id/imageButton" />

   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Start browsing with launch action"
      android:id="@+id/button2"
      android:layout_below="@+id/button"
      android:layout_alignLeft="@+id/button"
      android:layout_alignStart="@+id/button"
      android:layout_alignEnd="@+id/button" />
   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Exceptional condition"
      android:id="@+id/button3"
      android:layout_below="@+id/button2"
      android:layout_alignLeft="@+id/button2"
      android:layout_alignStart="@+id/button2"
      android:layout_toStartOf="@+id/editText"
      android:layout_alignParentEnd="true" />
</RelativeLayout>

Poniżej będzie treść res/layout/custom_view.xml plik -

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical" android:layout_width="match_parent"
   android:layout_height="match_parent">
   <TextView android:id="@+id/show_data"
      android:layout_width="fill_parent"
      android:layout_height="400dp"/>
</LinearLayout>

Poniżej będzie treść res/values/strings.xml zdefiniować dwie nowe stałe -

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <string name="app_name">My Application</string>
</resources>

Poniżej znajduje się domyślna zawartość AndroidManifest.xml -

<?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>
      
      <activity android:name="com.example.tutorialspoint7.myapplication.CustomActivity">

         <intent-filter>
            <action android:name = "android.intent.action.VIEW" />
            <action android:name = "com.example.tutorialspoint7.myapplication.LAUNCH" />
            <category android:name = "android.intent.category.DEFAULT" />
            <data android:scheme = "http" />
         </intent-filter>

      </activity>
   </application>

</manifest>

Spróbujmy uruchomić Twój My Applicationpodanie. Zakładam, że stworzyłeś swójAVDpodczas konfigurowania środowiska. Aby uruchomić aplikację z Android Studio, otwórz jeden z plików aktywności projektu i kliknij

ikonę Uruchom na pasku narzędzi. Android Studio instaluje aplikację na AVD i uruchamia ją, a jeśli wszystko jest w porządku z konfiguracją i aplikacją, wyświetli się następujące okno emulatora -

Teraz zacznijmy od pierwszego przycisku „Uruchom przeglądarkę za pomocą akcji VIEW”. Tutaj zdefiniowaliśmy naszą niestandardową aktywność za pomocą filtru „android.intent.action.VIEW” i istnieje już jedna domyślna aktywność przeciwko akcji VIEW zdefiniowanej przez Androida, która uruchamia przeglądarkę internetową, więc Android wyświetla następujące dwie opcje wyboru aktywności, chcesz uruchomić.

Teraz, jeśli wybierzesz opcję Przeglądarka, Android uruchomi przeglądarkę internetową i otworzy witrynę example.com, ale jeśli wybierzesz opcję IndentDemo, Android uruchomi CustomActivity, która nic nie robi, tylko przechwytuje przekazane dane i wyświetla w widoku tekstowym w następujący sposób -

Teraz wróć za pomocą przycisku Wstecz i kliknij przycisk „Uruchom przeglądarkę z akcją URUCHOM”, tutaj Android stosuje filtr, aby wybrać zdefiniowaną aktywność i po prostu uruchom swoją niestandardową aktywność

Ponownie wróć za pomocą przycisku Wstecz i kliknij przycisk „Warunek wyjątku”, tutaj Android próbuje znaleźć prawidłowy filtr dla danej intencji, ale nie znajduje prawidłowej czynności zdefiniowanej, ponieważ tym razem użyliśmy danych jako https zamiast http chociaż podajemy poprawną akcję, więc Android zgłasza wyjątek i wyświetla następujący ekran -