一.Intent介紹:
Intent的中文意思是“意圖,意向”,在Android中提供了Intent機制來協助應用間的互動與通訊,Intent負責對應用中一次操作的動作、動作涉及資料、附加資料進行描述,Android則根據此Intent的描述,負責找到對應的元件,将 Intent傳遞給調用的元件,并完成元件的調用。Intent不僅可用于應用程式之間,也可用于應用程式内部的Activity/Service之間的互動。是以,可以将Intent了解為不同元件之間通信的“媒介”專門提供元件互相調用的相關資訊。
二、Intent作用:
Intent 是一個将要執行的動作的抽象的描述,一般來說是作為參數來使用,由Intent來協助完成android各個元件之間的通訊。比如說調用startActivity()來啟動一個activity,或者由broadcaseIntent()來傳遞給所有感興趣的BroadcaseReceiver, 再或者由startService()/bindservice()來啟動一個背景的service.是以可以看出來,intent主要是用來啟動其他的activity 或者service,是以可以将intent了解成activity之間的粘合劑。
三.Inten啟動元件的方法:
Intent可以啟動一個Activity,也可以啟動一個Service,還可以發起一個廣播Broadcasts。具體方法如下:
元件名稱 | 方法名稱 |
Activity | startActvity( ) startActivity( ) |
Service | startService( ) bindService( ) |
Broadcasts | sendBroadcasts( ) sendOrderedBroadcasts( ) sendStickyBroadcasts( ) |
四.Intent的幾個重要屬性:
動作(Action),資料(Data),分類(Category),類型(Type),元件(Compent)以及擴充信(Extra)。其中最常用的是Action屬性和Data屬性。
1.Action屬性:
自定義的Activity:
1 <activity android:name=".TargetActivity">
2 <intent-filter>
3 <action android:name="com.scott.intent.action.TARGET"/>
4 <category android:name="android.intent.category.DEFAULT"/>
5 </intent-filter>
6 </activity>
除了自定義的action之外,Intent也内含了很多預設的action,随便列舉幾個:
1 public static final String ACTION_MAIN = "android.intent.action.MAIN";
2 public static final String ACTION_VIEW = "android.intent.action.VIEW";
3 public static final String ACTION_WEB_SEARCH = "android.intent.action.WEB_SEARCH";
4 public static final String ACTION_CALL = "android.intent.action.CALL";
2.data和extras,即執行動作要操作的資料和傳遞到目标的附加資訊
在目标<data/>标簽中包含了以下幾種子元素,他們定義了url的比對規則:
android:scheme 比對url中的字首,除了“http”、“https”、“tel”...之外,我們可以定義自己的字首
android:host 比對url中的主機名部分,如“google.com”,如果定義為“*”則表示任意主機名
android:port 比對url中的端口
android:path 比對url中的路徑
這個時候如果隻指定action就不夠了,我們需要為其設定data值,此時,url中的每個部分和TargetActivity配置資訊中全部一緻才能跳轉成功,否則就被系統拒絕。
不過有時候對path限定死了也不太好,比如我們有這樣的url:(scott://com.scott.intent.data:7788/target/hello)(scott://com.scott.intent.data:7788/target/hi)
這個時候該怎麼辦呢?我們需要使用另外一個元素:android:pathPrefix,表示路徑字首。
我們把android:path="/target"修改為android:pathPrefix="/target",然後就可以滿足以上的要求了。
而在進行搜尋時,我們使用了一個putExtra方法,将關鍵字做為參數放置在Intent中,我們成為extras(附加資訊),這裡面涉及到了一個Bundle對象。
Bundle和Intent有着密不可分的關系,主要負責為Intent儲存附加參數資訊,它實作了android.os.Paracelable接口,内部維護一個Map類型的屬性,用于以鍵值對的形式存放附加參數資訊。
3.category,要執行動作的目标所具有的特質或行為歸類
幾個常見的category如下:
常量 | 解釋 |
CATEGORY_DEFAULT | 預設的category |
CATEGORY_BROWSABLE | 指定了此category後,在網頁上點選圖檔或連結時,系統會考慮将此目标Activity列入可選清單,供使用者選擇以打開圖檔或連結。 |
CATEGORY_GADGET | The activity can be embedded inside of another activity that hosts gadgets. |
CATEGORY_HOME | The activity displays the home screen, the first screen the user sees when the device is turned on or when the HOME key is pressed. |
CATEGORY_LAUNCHER | The activity can be the initial activity of a task and is listed in the top-level application launcher. |
CATEGORY_PREFERENCE | 表示該目标Activity是一個首選項界面; |
4.type:要執行動作的目标Activity所能處理的MIME資料類型
例如:一個可以處理圖檔的目标Activity在其聲明中包含這樣的mimeType:
1 <data android:mimeType="image/*" />
在使用Intent進行比對時,我們可以使用setType(String type)或者setDataAndType(Uri data, String type)來設定mimeType。
5.component,目标元件的包或類名稱
在使用component進行比對時,一般采用以下幾種形式:
1 intent.setComponent(new ComponentName(getApplicationContext(), TargetActivity.class));
2 intent.setComponent(new ComponentName(getApplicationContext(), "com.scott.intent.TargetActivity"));
3 intent.setComponent(new ComponentName("com.scott.other", "com.scott.other.TargetActivity"));
其中,前兩種是用于比對同一包内的目标,第三種是用于比對其他包内的目标。
【注意】:如果我們在Intent中指定了component屬性,系統将不會再對action、data/type、category進行比對。