Android Intent 機制解析 - Intent 是什麼?作用是什麼?

前言

Intent 相信大家都對它不陌生,startActiviy、startService、bindService、sendBroadcast…等常用方法都需要Intent來協助完成,那麼,問題來了:“Intent 是什麼?其作用是什麼?其中有着怎樣的機制呢?”

Intent 概述

Intent是一種運行時綁定(run-time binding)機制,它是一種基於某種想要被表露的意圖的被動式數據結構,它能在程序運行過程中連接兩個不同的組件。通過Intent,你的程序可以向Android表達某種請求或者意願,Android會根據意願的內容選擇適當的組件來完成請求。

四大基本組件中,Activity、Service、BroadcastReceiver 都需要通過Intent機制來激活,不同的組件需要不同的Intent傳遞方式

Intent一旦發出,Android都會準確找到相匹配的一個或多個Activity,Service或者BroadcastReceiver作響應。所以,不同類型的 Intent 消息不會出現重疊,即Broadcast的Intent消息只會發送給BroadcastReceiver,而決不會發送給Activity或者Service。由startActivity()傳遞的消息也只會發給Activity,由startService()傳遞的Intent只會發送給Service。

Intent 結構

  • action – 想要實施的動作,例: ACTION_VIEW, ACTION_EDIT, ACTION_MAIN, etc.
  • data – 具體的數據,一般由以Uri表示,例:通訊錄中的某條記錄,會以Uri來表示
  • category – 爲實施的動作添加的額外信息,即Intent組件的種類信息,一個Intent對象可以有任意個category,例:CATEGORY_LAUNCHER 意味着,它應該在啓動器中作爲頂級應用而存在
  • type – 顯示指定Intent的數據類型(MIME類型 - 多用途互聯網郵件擴展,Multipurpose Internet Mail Extensions),例:一個組件是可以顯示圖片數據的而不能播放聲音文件。很多情況下,data類型可在URI中找到,比如content:開頭的URI,表明數據由設備上的content provider提供。但是通過設置這個屬性,可以強制採用顯式指定的類型而不再進行推導
    MIME類型有兩種:單個記錄格式、多個記錄格式
  • component – 指定Intent的目標組件的類名稱。通常 Android會根據Intent 中包含的其它屬性的信息,比如action、data/type、category進行查找,最終找到一個與之匹配的目標組件。但是,如果 component這個屬性有指定的話,將直接使用它指定的組件,而不再執行上述查找過程。指定了這個屬性以後,Intent的其它所有屬性都是可選的,例如:Intent it = new Intent(Activity.Main.this, Activity2.class); startActivity(it);
  • extras – 附加信息,例如:it.putExtras(bundle) - 使用Bundle來傳遞數據;

顯式與隱式 Intent

-* 顯式Intent:通過指定具體的組件類*,通知應用啓動對應的組件。例如:指定了component屬性的、對Intent調用setComponent(ComponentName)或者setClass(Context, Class)的。
-* 隱式Intent:*沒有指定具體comonent屬性的Intent,設置了Action、Data、Category,讓系統來篩選出合適的組件來進行調用(通過來篩選);這些Intent需要包含足夠的信息,這樣系統才能根據這些信息,在在所有的可用組件中,確定滿足此Intent的組件。

Intent 解析機制

對於顯式Intent,目標組件很明確,故Android**不需要解析,Android需要解析的是間接Intent**,解析後,Intent即可映射給處理此Intent的Activity、Service或BroadcastReceiver。

解析機制
1. 通過查找已註冊在AndroidManifest.xml的所有及其中定義的intent
2. 通過PackageManager來查找能夠處理這個Intent的component,因爲PackageManager能夠獲取設備上當前所安裝的application package信息,解析過程主要是通過intent中的action、type、category三個屬性來判斷。
匹配規則:
1. 如果指定action,則目標組件的IntentFilter需要含有這個action
2. 如果Intent沒有提供type,系統將從data中得到數據類型,類似action的匹配規則,目標組件必須包含Intent的數據類型,否則不匹配
3. 如果Intent中的數據不是content類型的Uri,而且Intent也沒有明確指定type,將根據Intent中數據的scheme(如 http:或者mailto:)進行匹配,同上,Intent的scheme必須出現在目標組件的scheme列表中
4. 如果Intent指定了一個或者多個category,那麼目標組件的類別列表需要包含全部所指定的類別。(如:LAUNCHER_CATEGORY和ALTERNATIVE_CATEGORY)

資料來源

Intent - Android Developers
Android - Intent機制詳解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章