Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android意圖[結構]和意圖過濾器

Android意圖[結構]和意圖過濾器

編輯:關於Android編程

一、意圖Intent

我們都知道Android 應用框架中的4大基本組件分別是:

活動----繪制一個屏幕的用戶界面,響應用戶交互

服務----在後台運行,執行耗時操作或遠程過程調用

廣播接收器----響應系統級(或自定義)的廣播通知

數據源----管理數據訪問接口(應用內或系統級)

1. 意圖Intent在應用框架中的位置

Android 應用框架讓你使用一組可重用的基本組件即可創建出豐富而有創意的應用程序。

雖然每個組件是一個獨立的存在,扮演特定的角色,但是部分組件之間存在依賴關系,應用框架使用意圖(Intent)將組件連接起來,共同構成一個程序的整體行為。

2. 什麼是意圖?

意圖是組件間傳遞消息的一種對象,主要由動作(action)和數據(data)兩部分組成。Intent負責對應用中一次操作的動作、動作涉及數據、附加數據進行描述,Android則根據此Intent的描述,負責找到對應的組件,將 Intent傳遞給調用的組件,並完成組件的調用。因此,Intent在這裡起著一個媒體中介的作用,專門提供組件互相調用的相關信息,實現調用者與被調用者之間的解耦。

Intent意圖是要執行的操作的抽象描述。用於請求其他組件(活動、服務、廣播接收器)中的操作,完成組件之間的交互。

由Intent來協助完成android各個組件之間的通訊。比如調用Activity實例化對象的startActivity()來啟動一個activity,或者由broadcaseIntent()來傳遞給所有感興趣的BroadcaseReceiver, 或者由startService()/bindservice()來啟動一個後台的service。可見,intent主要用來啟動activity或者service(並攜帶需要傳遞的參數信息)。

總之,Intent具有激活組件和攜帶數據的功能!

3. 意圖的三種使用場景

場景

方法

啟動活動

startActivity

startActivityForResult

啟動服務

startService

bindService

發送廣播

sendBroadcast

sendOrderedBroadcast

sendStickyBroadcast

4. 意圖的兩種類型

類型

描述

顯式意圖

通過類名指定要啟動的組件(在應用內部);如啟動一個活動查看信息詳細內容或啟動一個服務在後台下載文件。

提示:處於安全考慮,使用顯式意圖啟動程序中的服務。

隱式意圖

不指定組件的名稱,而是聲明要執行的動作,這樣就允許其他應用中的組件處理這個動作;如點擊一個超鏈接,啟動了浏覽器開始加載這個頁面。

明確指定組件名的意圖Intent為顯式意圖,指定了Intent應該傳遞給哪個組件,並且可以設定需要傳遞的參數信息。由於顯示意圖指定了具體的組件對象,不需要設置intent的其它意圖過濾對象。

沒有明確指定組件名的Intent為隱式意圖,系統會根據隱式意圖中設置的動作(action)、類別(category)、數據URI等來匹配最合適的組件。

5. 兩種意圖的使用區別

顯式意圖一般在應用的內部使用,因為在應用內部已經知道了組件的名稱,比如從主活動MainActivity跳轉到下一個活動NextActivity,直接調用就可以了。當一個應用要激活另一個應用中的Activity時,比如點擊一個網址鏈接,要另起浏覽器,只能使用隱式意圖,根據Activity配置的意圖過濾器建一個意圖,讓意圖中的各項參數的值都跟過濾器匹配,這樣就可以激活其他應用中的Activity。所以,隱式意圖是在應用與應用之間使用的。

顯式意圖:必須指定要激活的組件的類名和完整包名,一般激活自己應用的組件的時候采用顯示意圖。

隱式意圖:只需要指定要執行的動作和要攜帶的數據就可以,激活別人應用的時候使用,不需要關心對方的包名和類名。

6. 隱式意圖—圖解

\

(1)Activity A 創建一個有動作描述的Intent 並傳遞給 startActivity 方法。

(2)Android 系統搜索所有應用中的Intent Filter 來匹配該 Intent,若找到。

(3)Android 系統通過調用onCreate 創建匹配 Intent 的 Activity B,並把Intent 傳遞給 Activity B。

7. 意圖的結構

意圖Intent作為聯系各組件之間的紐帶,其作用並不僅僅只限於簡單的數據傳遞。通過其自帶的屬性,可以方便的完成很多較為復雜的操作。例如直接調用撥號功能、直接自動調用合適的程序打開不同類型的文件等等。諸如此類,都可以通過設置Intent屬性來完成。Intent類的屬性如下:

\

字段

描述

action

要執行的動作(字符串常量 )

data

要操作的數據(Uri 類型)

category

組件的類別信息

type

明確指定要操作的數據類型(MIME)(默認根據數據判定)

component

目標組件的類名(若指定該屬性,其他屬性皆為可選)

extras

傳遞的附加信息,如郵件的標題、內容(鍵值對形式)

flag

標記系統如何啟動活動

(1)常用 Action

action屬性是Intent意圖類最重要的屬性。Action是指Intent要完成的動作,是一個字符串常量。使用 setAction() 和 getAction()來設置和讀取Action屬性。

注意:一個Intent只能指定一個action,但是一個Activity(或廣播等組件)可以設置(監聽、匹配)多個action(即intent-filter中可以設置多個action屬性)。

動作

描述

ACTION_MAIN

應用的入口(啟動的第一個活動),不接收數據

ACTION_EDIT

提供對指定數據(Uri)的編輯

ACTION_VIEW

顯示數據

ACTION_PICK

選擇並獲得選中的一項數據(如選擇照片)

ACTION_DIAL

預備撥打指定的號碼

ACTION_CALL

直接撥打指定的號碼

(2)data數據(Uri 類型)

data屬性在Intent意圖類種也非常重要。Data屬性是執行動作的URI和MIME類型,不同的動作有不同的數據規格。Data通常是Uri格式定義的操作數據.

   當匹配intent和能夠處理intent所帶的數據的組件時,知道數據類型(MIME類型)是很重要的。比如,一個展示圖像的組件不應該被叫去播放一個音頻。

   很多情況下,從URI可以看出數據類型,比如content:URIs,表示數據是在設備上,但是是由content provider控制。

   數據類型也可以顯式指定,比如setData(Uri)方法指定數據為Uri,setType(Stringtype) 指定為MIME type,setDataAndType()指定它既為URI又為MIME type。讀取的時候URI用getData(),MIME type用getType()。

動作與數據

描述

ACTION_VIEW

content://contacts/people/1

查看聯系人中編號為1的信息

ACTION_EDIT

content://contacts/people/1

編輯聯系人中編號為1的信息

ACTION_SENDTO

mailto:[email protected]

向指定的郵箱發送郵件

ACTION_DIAL

tel:10086

預備撥打指定的號碼

ACTION_CALL

tel:10086

直接撥打指定的號碼

(3)category意圖的類別

Category是一個字符串,提供了額外的信息,有關於能夠處理這個Intent對象的組件種類,一般在隱式地啟動activity時需要用到。

與category相應的方法有添加addCategory()、移除removeCategory() 和獲取所有category getCategories()。默認為CATEGORY_DEFAULT。常用類別如下:

類別

描述

CATEGORY_LAUNCHER

常和 ACTION_MAIN 配合使用,標明活動會出現在應用列表中

CATEGORY_DEFAULT

活動的默認類別(接收隱式意圖啟動的活動,至少要設置為這個類別)

CATEGORY_APP_MUSIC

聲明該程序是一個音樂播放程序

CATEGORY_APP_MARKET

聲明該程序是一個應用市場

CATEGORY_ALTERNATIVE

聲明該活動是執行某個操作的備選

(4)其他屬性

component name即組件名稱,是要【處理】這個Intent對象的組件名稱。組件名稱對象由ComponentName類來封裝,組件名稱包含包名稱和類名稱,被聲明在AndroidManifest.xml文件中。組件名稱通過 setComponent(),setClass(),setClassName()設置,通過getComponent()獲取。需要注意的是Componentname是一個可選項,如果被設置,那麼Intent對象就顯式指定了要轉向的組件;如果沒有被設置,則Intent對象需要根據其他信息進行篩選查找。

extras:傳遞給Intent的額外數據,以Bundle的形式定義,就是一些鍵值對。數據可以被作為一個Bundle對象被使用,利用 putExtras() 和 getExtras()方法。

flags:各種類型的Flag。很多是用來指定Android系統如何啟動activity,還有啟動了activity後如何對待它。所有這些都定義在Intent類中。

二、意圖過濾器IntentFilter

IntentFilter就是“意圖過濾器”,主要用來過濾隱式意圖。當用戶進行一項操作的時候,Android系統會根據配置的 “意圖過濾器” 來尋找可以響應該操作的組件,服務。

例如:當用戶點擊PDF文件的時候,Android系統就會通過設定好的意圖過濾器,進行匹配測試。找到能夠打開PDF文件的APP程序;此時就可能使用隱式意圖打開了手機WPS,這是生活中常見到的。

Android 系統通過搜索所有程序的意圖過濾器來匹配執行哪一個隱式意圖;意圖過濾器是對組件功能、特性的聲明,一個組件(不論活動、服務還是廣播接收器)都可以聲明一個或多個過濾器來接收隱式意圖。

1. 意圖過濾器IntentFilter的使用

在清單配置文件(manifest.xml)中為組件聲明意圖過濾器包含以下三個元素:

動作的名稱,一個字符串常量

接收的數據類型,Uri 格式

接收的意圖類型,必須包含CATEGORY_DEFAULT

2. data 的格式

在清單文件manifest.xml中為組件聲明意圖過濾器包含三個元素,和和前面講的一樣。data 的格式有所不同。

字段名

描述

schema

模式:如 http、tel、content、mailto 等(全部小寫字母)

若該屬性未指定,除 mimeType 外的其他屬性都會被忽略

host

主機名,若該屬性未指定,端口及所有路徑屬性都會被忽略

port

端口號,依賴前面屬性

path

路徑,依賴前面屬性

pathPattern

路徑模式,依賴前面屬性

pathPrefix

路徑前綴,依賴前面屬性

mimeType

Multi-Purpose Internet Mail Extensions,如 image/*

://:/[||]

3. 清單文件中聲明IntentFilter事例

\

可以給一個組件注冊多個意圖過濾器

三、實例

1. 創建隱式意圖

實例效果如下圖:

\

(1)創建一個新的工程,自定義命名。在主活動MainActivity對應的布局文件activity_main.xml中擺出3個Button,如上圖所示。

(2)在布局文件activity_main.xml中給3個Button都添加屬性

android:onClick="方法名","方法名"指定的方法需要我們自己在主活動MainActivity類中定義;當點擊Button時,就會執行"方法名"指定的方法。

(3) "方法名"指定方法的實現

准備撥號

\

發送電子郵件

\

去相冊選取照片

\

顯示選取的照片

\

android:onClick="方法名"中,"方法名"分別替換上圖所示的3個方法名doDail()、doSendMail()、doPick()即可。當點擊Button時,就會執行"方法名"指定的方法。而這些方法都在方法體裡創建隱式意圖,系統會根據隱式意圖中設置的動作(action)、類別(category)、數據URI等來匹配最合適的組件。比如點擊第一個Button執行doDail()方法,就會打開撥號器;第二個會去找手機系統默認指定的“電子郵件程序”。

2. 使用意圖啟動新活動

實例效果如下圖:

\

(1)和上一個實例一樣,創建一個新的工程,自定義命名。在主活動MainActivity對應的布局文件activity_main.xml中擺出1個EditText和2個Button,如上圖所示。

(2)在布局文件activity_main.xml中給3個Button都添加屬性

android:onClick="方法名"

需要自定義一個活動NextActivity,用2中方式實現從主活動MainActivity到NextActivity的跳轉並攜帶數據。NextActivity對應的布局文件上只有一個TextView用於顯示接收到的數據。

(3) "方法名"指定方法的實現

顯式啟動活動

\

隱式啟動活動

\

工程清單文件:

xml version="1.0"encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ljheee.intent.startactivitybyintent">

<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=".NextActivity"
android:label="NextActivity">

<intent-filter>
<action android:name="com.ljheee.intent.DATA_CONVERT"/>
<category android:name="android.intent.category.DEFAULT"/>
intent-filter>
activity>

application>
manifest>

接收傳遞的數據

\

 

完整工程:https://github.com/ljheee/StartActivityByIntent

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved