Android – Ý định/Bộ lọc (Intents/Filters)


Intent Android là một mô tả trừu tượng về một thao tác được thực hiện. Intent được sử dụng với startActivity để chạy Activity, với broadcastIntent để gửi nó tới các Component BroadcastReceiver, với startService(Intent) hoặc bindService(Intent, ServiceConnection, int) để liên lạc với các Service chạy ở nền ứng dụng.

Một đối tượng Intent là một cấu trúc dữ liệu bị động giữ mô tả trừu tượng về một thao tác được thực hiện.

Ví dụ, bạn có một Activity cần để đọc và gửi email trên thiết bị Android. Để thực hiện nhiệm vụ này, Activity của bạn sẽ gửi một ACTION_SEND cùng với chooser thích hợp, tới Android Intent Resolver. Chooser này cung cấp giao diện cho người dùng để chọn cách gửi email (Email hay Gmail).

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

Trên đây là đoạn code để khởi động Email Activity, bạn sẽ thấy kết quả hiện ra như hình bên dưới:

Send Email

Thêm một ví dụ nữa, bạn có một Activity cần mở một URL trong trình duyệt web. Để thực hiện được mục đích này, Activity của bạn sẽ gửi Intent ACTION_WEB_SEARCH tới Android Intent Resolver để mở URL trong trình duyệt web. Intent Resolver sẽ tìm trong danh sách Activity và chọn ra cái nào phù hợp nhất với Intent bạn gửi đến. Trong trường hợp này, Web Browser Activity được chọn. Intent Resolver sẽ truyền đường dẫn của bạn vào Web Browser Activity và chạy Activity này.

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

Trong đoạn code trên, tham số truyền vào là từ khóa tutorialspoint, Activity của bạn sẽ mở một trình duyệt web với kết quả tra từ khóa tutorialspoint trên công cụ tìm kiếm.

Có các cơ chế riêng để truyền Intent tới từng loại Component: Activity, Service, and Broadcast Receiver.

Cơ chế Phương pháp & Mô tả
1 Context.startActivity() Đối tượng Intent được truyền vào phương thức này để chạy một Activity mới hoặc ra lệnh cho Activity nào đó làm một nhiệm vụ mới.
2 Context.startService() Đối tượng Intent được truyền vào phương thức này để khởi tạo một Service hoặc truyền các chỉ dẫn mới đến các Service đang hoạt động.
3 Context.sendBroadcast() Đối tượng Intent được truyền vào phương thức này để gửi tin nhắn tới tất cả các Broadcast Receivers.

Đối tượng Intent

Đối tượng Intent là một gói thông tin được dùng bởi các Component. Các Component nhận các Intent như là thông tin được sử dụng bởi hệ thống Android.

Đối tượng Intent có thể chứa những thành phần sau đây, tùy thuộc vào nó thực hiện nhiệm vụ gì: 

Action (Hành động)

Đây là thành phần bắt buộc của đối tượng Intent và là một chuỗi (string) đặt tên Action mà Intent đó phải thực hiện. Phần Action định nghĩa cấu trúc những phần còn lại của đối tượng Intent. Đây là danh sách các Action cơ bản của Intent.

Action của một đối tượng Intent có thể được thiết lập bằng phương thức setAction() và được đọc bằng phương thức getAction().

Data (Dữ liệu)

Thêm một Data Specification vào một Intent Filter. Ở đây Specification có thể chỉ là loại dữ liệu (mimeType attribute), là một URI, hoặc là cả dữ liệu và URI. Một URI được biểu diễn thành từng phần là các thuộc tính:

Sau đây là ví dụ một vài cặp Action/Data

No. Cặp Action/Data & Mô tả
1 ACTION_VIEW content://contacts/people/1 Hiển thị thông tin về người có số ID là 1.
2 ACTION_DIAL content://contacts/people/1 Hiển thị ứng dụng gọi điện với thông tin của người có số ID là 1.
3 ACTION_VIEW tel:123   Hiển thị ứng dụng gọi điện cho số 123.
4 ACTION_DIAL tel:123 Hiển thị ứng dụng gọi điện với số sẵn có là 123.
5 ACTION_EDIT content://contacts/people/1 Thay đổi thông tin về người có ID là 1.
6 ACTION_VIEW content://contacts/people/ Hiển thị danh sách tất cả mọi người trong đường dẫn.
7 ACTION_SET_WALLPAPER Hiển thị phần cài đặt chọn hình nền.
8 ACTION_SYNC Sắp đồng bộ hóa dữ liệu, giá trị Constant là android.intent.action.SYNC
9 ACTION_SYSTEM_TUTORIAL Chạy tài liệu hướng dẫn tương ứng với platform (tài liệu  mặc định hoặc tài liệu bắt đầu).
10 ACTION_TIMEZONE_CHANGED Thông báo múi giờ thay đổi.
11 ACTION_UNINSTALL_PACKAGE Chạy trình gỡ bỏ ứng dụng mặc định.

Phương thức setData() xác định dữ liệu như một URI, setType() xác định dữ liệu như là một kiểu MIME, và setDataAndType() xác định dữ liệu cả URI và kiểu MIME. URI được đọc bởi phương thức getData() và kiểu được đọc bằng phương thức getType().

Category (Phân loại)

Category là phần không bắt buộc của đối tượng Intent và nó là một chuỗi chứa thông tin bổ sung về loại Component quản lý Intent. Phương thức addCategory() xác định Catogory cho một đối tượng Intent, removeCategory() xóa Category đã thêm khỏi đối tượng Intent, và getCategories() đọc ra các Category của đối tượng Intent. Sau đây là bảng liệt kê các Category cơ bản của Intent trong Android.

Bạn có thể xem chi tiết về Intent Filter bên dưới để hiểu Category được dùng để chọn Activity thích hợp với từng Intent như thế nào.

Extra

Đây là một cặp key-value (khóa-giá trị) để truyền thông tin phụ tới Component quản lý Intent. Extra có thế được thiết lập hoặc đọc bằng các phương thức putExtras() và getExtras() Sau đây là danh sách các Extra cơ bản của Intent trong Android.

Flag (Cờ)

Flag là phần không bắt buộc của một đối tượng Intent và thông tin cho hệ thống Android làm thế nào để chạy một Activity và các bước tiếp theo sau khi Activity đã được khởi động.

No. Flag & Mô tả
1 FLAG_ACTIVITY_CLEAR_TASK  Nếu Flag này được thiết lập trong một Intent để truyền vào phương thức Context.startActivity(), nó sẽ ra lệnh xóa các nhiệm vụ tồn tại trước đó với Activity này trước khi Activity được kích hoạt. Có nghĩa là Activity này sẽ không chứa bất cứ nhiệm vụ nào, Flag này có thể được dùng cùng với Flag FLAG_ACTIVITY_NEW_TASK.
2 FLAG_ACTIVITY_CLEAR_TOP  Nếu Flag này được thiết lập, Activity đang chạy và đang thực hiện nhiệm vụ của nó, sẽ không tạo một Instance mới của Activity đó, mà tất cả các Activity đang ở trên nó sẽ bị đóng và Intent này sẽ được truyền vào Activity đó như một Intent mới.
3 FLAG_ACTIVITY_NEW_TASK  Flag này được dùng bởi các Activity muốn thực hiện hành vi “launcher”: các Activity này cung cấp cho người dùng một danh sách các việc riêng rẽ có thể được thực hiện và chạy độc lập với Activity khởi động chúng.

Component Name (Tên của Component)

Trường không bắt buộc này là một đối tượng ComponentName tượng trưng cho lớp Activity, Service hoặc BroadcastReceiver. Nếu nó được thiết lập, đối tượng Intent được truyền tới một Instance của một lớp đã được thiết kế thay vì Android dùng những thông tin khác trong đối tượng Intent để xác định mục tiêu.

Component Name được thiết lập bởi setComponent(), setClass(), hoặc setClassName() và được đọc bởi getComponent().

Các loại Intents

Có 2 loại Intent được hỗ trợ Android: Explicit Intent và Implicit Intent

Intent

Explicit Intent

Explicit Intent được kết nối với thế giới bên trong của ứng dụng, kiểu như bạn muốn kết nối với một Activity với một Activity khác. Dưới đây là hình ảnh kết nối từ First Activity tới Second Activity bằng cách bấm nút Click me!.

Explicit Intents

Các Explicit Intent xác định Component đích bởi tên của chúng và được sử dụng như tin nhắn trong nội bộ ứng dụng. Ví dụ như một Activity khởi động một Service phụ thuộc vào nó hoặc khởi động một Activity cùng cấp. Hãy xem ví dụ sau:

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

// Starts TargetActivity
startActivity(i);

Implicit Intent

Implicit Intent không cần tên của đối tượng đích và truongf cho tên tên của Component được để trống. Implicit Intent thường không được dùng để kích hoạt các Component trong ứng dụng khác, xem ví dụ sau:

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

Kết quả của đoạn code trên như sau:

Intent

Component đích nhận Intent có thể dùng phương thức getExtras() để nhận dữ liệu Extra được gửi bởi Component gốc, xem ví dụ sau:

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

Ví dụ

Ví dụ sau đây minh họa tính năng của Intent trong Android trong việc chạy các ứng dụng có sẵn trên Android.

Bước Mô tả
1 Bạn sẽ dùng IDE tạo ứng dụng Android mới và đặt tên là My Application dưới package com.example.saira_000.myapplication. Trong khi tạo Project này, hãy chắc chắn rằng các giá trị Target SDK và Compile With nằm tại phiên bản cao nhất của Android SDK để sử dụng mức độ cao nhất của API.
2 Chỉnh sửa tập tin src/main/java/MainActivity.java và thêm code để xác định 2 listeners tương ứng với 2 nút bấm Start Browser và Start Phone.
3 Chỉnh sửa tập tin layout XML res/layout/activity_main.xml để thêm 3 nút trong Linear Layout.
4 Chạy ứng dụng trên Android emulator và xem kết quả.

Sau đây là nội dung đã chỉnh sửa của tập tin 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.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("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);
         }
      });
   }
   
   @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);
   }
}

Sau đây là nội dung của tập tin res/layout/activity_main.xml đã được chỉnh sửa

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

Sau đây là nội dung tập tin res/values/strings.xml, trong đó xác định 2 constant mới:

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

Sau đây là nội dung mặc đinh của AndroidManifest.xml

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

Thử chạy ứng dụng, bạn sẽ thấy trên màn hình Emulator như ảnh bên dưới:

Android Intent Screen

Bây giờ hãy bấm nút Start Browser, Browser mở đường dẫn http://www.example.com sẽ hiện lên như sau:

Android Intent Browser

Bằng cách tương tự như vậy, bạn mở ứng dụng gọi điện có sẵn số điện thoại 9510300000 bằng nút Start Phone.

Intent Filter

Ở ví dụ trên bạn đã thấy một Intent gọi một Activity như thế nào. Hệ điều hành Android dùng Filter để xác định các Activity, Service, and Broadcast Receiver quản lý Intent với sự giúp đỡ của Action, Category, Data Scheme tương ứng với Intent. Bạn sẽ dùng thẻ <intent-filter> trong tập tin manifest để liệt kê các Action, Category, Data Scheme tương ứng với Activity, Service, hoặc Broadcast Receiver.

Sau đây là  một phần của tập tin AndroidManifest.xml chỉ ra rằng Activity com.example.My Application.CustomActivity có thể được xác định bởi 2 Action, 1 Category, 1 Data:

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

Một khi Activity này được xác định với các Filter trên, các Activity khác có thể gọi tới Activity này bằng cách dùng android.intent.action.VIEW, hoặc com.example.My Application.LAUNCH hoặc android.intent.category.DEFAULT.

Thẻ <data> xác định kiểu dữ liệu mà Activity cần, như trong ví dụ trên là “http://”

Có thể xảy ra tình huống mà trong đó một Intent có thể truyền thông qua Filter của nhiều hơn 1 Activity hoặc Service, người dùng có thể được hỏi sẽ phải kích hoạt Component nào. Một Exception sẽ được thông báo nếu như không tìm thấy đích đến nào.

Những kiểm tra sau sẽ được Android kiểm tra trước khi khởi động Activity:

  • Một Filter <intent-filter> có thể liệt kê nhiều hơn một Action nhưng danh sách này không thể để trống; một Filter phải chứa ít nhất 1 thành phần <action>, nếu không nó sẽ áp dụng cho tât cả các Intent. Nếu nhiều hơn 1 Action được tìm thấy thì Android sẽ thử chọn cái nào phù hợp trước khi khởi động Activity.
  • Một Filter <intent-filter> có thể liệt kê 1 hoặc nhiều hơn Category, hoặc có thể không có Category nào. Nếu  không có Category nào được chỉ ra thì Android luôn luôn bỏ qua phần này. Nếu có nhiều Category, từng Category trong đối tượng Intent phải trùng với một trong các Category của Filter.
  • Mỗi thành phần <data> có thể chỉ ra URI và kiểu dữ liệu MIME. Có các thuộc tính như scheme, host, port, và path cho từng phần của URI. Một đối tượng Intent chứa cả URI và kiểu dữ liệu vượt qua kiểm tra chọn lọc khi và chỉ khi kiểu dữ liệu trùng với một trong các kiểu dữ liệu của Filter.

Ví dụ

Sau đây là vi dụ được chỉnh sửa từ ví dụ trên. Sau đây bạn sẽ xem cách Android giải quyết xung đột nếu một Intent gọi 2 Activity, và cách gọi một Activity dùng Filter và cách mà Android giải quyết khi không tim thấy Action nào phù hợp cho Intent.

1 Bạn sẽ dùng IDE tạo ứng dụng Android mới và đặt tên là My Application dưới package com.example.saira_000.myapplication. Trong khi tạo Project này, hãy chắc chắn rằng các giá trị Target SDK và Compile With nằm tại phiên bản cao nhất của Android SDK để sử dụng mức độ cao nhất của API.
2 Chỉnh sửa tập tin src/main/java/MainActivity.java và thêm code để xác định 2 listeners tương ứng với 2 nút bấm Start Browser và Start Phone.
3 Chỉnh sửa tập tin layout XML res/layout/activity_main.xml để thêm 3 nút trong Linear Layout.
4 Chạy ứng dụng trên Android emulator và xem kết quả.

Bước Mô tả
1 Bạn sẽ dùng IDE tạo ứng dụng Android mới và đặt tên là My Application dưới package com.example.saira_000.myapplication. Trong khi tạo Project này, hãy chắc chắn rằng các giá trị Target SDK và Compile With nằm tại phiên bản cao nhất của Android SDK để sử dụng mức độ cao nhất của API.
2 Chỉnh sửa src/Main/Java/MainActivity.java và thêm 3 listener tương ứng với 3 nút được thêm trong tập tin layout.
3 Thêm tập tin mới src/Main/Java/CustomActivity.java, trong đó là một Activity được gọi bởi các Intent khác nhau.
4 Chỉnh sửa tập tin layout XML file res/layout/activity_main.xml để thêm 3 nút trong Linear Layout.
5 Thêm 1 tập tin layout XML res/layout/custom_view.xml , trong đó thêm 1 <TextView> để hiển thị dữ liệu đã truyền qua Intent.
6 Chỉnh sửa AndroidManifest.xml, trong đó thêm <intent-filter> để xác định bộ lọc cho Intent của bạn gửi tới Activity.
7 Chạy ứng dụng trên Android emulator và xem kết quả.

Sau đây là nội dung của tập tin Main Activity src/MainActivity.java.

package com.example.saira_000.myapplication;

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("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.My Application.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);
         }
      });
   }
   
   @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);
   }
}

Sau đây là nội dung của tập tin src/com.example.My Application/CustomActivity.java.

package com.example.saira_000.myapplication;

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());
   }
}

Following will be the content of res/layout/activity_main.xml file −

<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 browsing with view action"
      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 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_alignRight="@+id/textView2"
      android:layout_alignEnd="@+id/textView2" />
      
   <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_alignRight="@+id/textView2"
      android:layout_alignEnd="@+id/textView2" />

</RelativeLayout>

Nội dung của tập tin res/layout/custom_view.xml như sau:

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

Nội dung của tập tin res/values/strings.xml, trong đó xác định 2 constant mới−

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

Sau đây là nội dung mặc định của tập tin AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.My Application"
   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/AppTheme" >
      
      <activity
         android:name="com.example.saira_000.myapplication"
         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.saira_000.myapplication.CustomActivity" 
         <android:label="@string/app_name">
      
         <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <action android:name="com.example.saira_000.myapplication.LAUNCH" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="http" />
         </intent-filter>
      
      </activity>
      
   </application>
</manifest>

Thử chạy ứng dụng, trên màn hình Emulator sẽ hiện ra như hình bên dưới:

Android Custom Activity

Bây giờ hãy bấm nút đầu tiên “Start Browser with VIEW Action”. Ở đây, chúng ta định nghĩa Activity mới với Filter “android.intent.action.VIEW”, và có một Activity mặc định được định nghĩa bởi Android là Activity Web Browser, Android sẽ giải quyết vấn đề bằng cách hiển thị 2 lựa chọn cho người dùng quyết định sẽ chọn Activity nào.

Android Two Activities

Nếu bạn bấm chọn Browser, thì Android sẽ mởi trình duyệt web (Web Browser) và mở website example.com. Nếu bạn chọn IndentDemo thì Android sẽ khởi động CustomActivity, trong đó hiển thị dữ liệu được truyền qua Intent ra màn hình như hình bên dưới:

Android Custom Activity Runs

Bây giờ bấm nút Back để quay trở lại Activity chính và bấm nút “Start Browser with LAUNCH Action”. Android sẽ dùng Filter để chọn Activity và tất nhiên nó sẽ kích hoạt CustomActivity.

Một lần nữa quay trở lại Activity chính và bấm nút “Exception Condition”, ở đây Android thử tìm Filter phù hợp nhưng không thành công bởi vì lúc này chúng ta dùng dữ liệu https thay vì http mặc dù chúng ta cung cấp Action phù hợp, Android gọi một Exception và hiển thị ra màn hình như sau:

Android Exception Screen

1831 Total Views 6 Views Today