2011年9月28日 星期三

[AndroidIntent] Intent Filter note

對一個android的應用程式而言,最重要的檔案是AndroidManifest.xml。它負責向下一層的framwork註冊該應用程式,包括此應用程式的名字,分組 (哪個category),用哪個icon,有什麼功能 (avtivity,service,broadcast receiver,content provider)等等。使得framework (package manager)接到通知 (intent)時,能夠根據目前系統註冊的情況,濾出符合條件的功能。


* Definition
  • Android 系統如何判斷哪個元件可以接收哪個 intent, 宣告在 AndroidManifest.xml 中。
  • 宣告元件時可加入的 Intent Filter 設定,屬性有 action, category, data,三個在一組內皆能有多個,只要符合三個各自條件,即通過此 intent-filter
  • 每個元件內可以設定 0 ~ 多組 的 intent filter每一組的 Intent Filter 都是一份比對規則,只要通過一組即可


* Process
當 intent 發出來時,系統會去檢查Manifest 內各元件內的intent filter, 而啟動適合的元件,若元件沒有設定filter,那就只能接收到有清楚指定 component 的 intent。


* action: 執行 intent 的方式。
  • 能有 0 ~ 多個
  • 合格條件: intent 中的 action 為 intent-filter 宣告的之一。
    • 如果沒有宣告任何一個,因為 intent 沒得比對,所以沒有任何 intent 會符合;
    • 如果是 intent 沒有帶有 action,filter 中至少有宣告一個,即能通過此 filter。

* category: intent 的類別。
  • 能有 0 ~ 多個
  • 合格條件: intent-filter 中必須完全符合 intent 中的 category
    • intent-filter 宣告比 intent 中還多的 category 是不影響的。
    • i.e. intent 中沒有 category,即合格。
  • Default Category
    • 當執行 startActivity() 而使用沒有明確設定目標的 intent (implicit intent),Category 會預設為 Intent.CATEGORY_DEFAULT
    • 因此,若 componen 需要接收 implicit intent,就必須在 intent filter 裡加上"android.intent.category.DEFAULT"。
    • 例外中的例外: 如果 filter 設定 "android.intent.action.MAIN" 和 "android.intent.category.LAUNCHER",則不需指定 DEFAULT 也可接收 implicit intent。

* data: intent 的資料類型。
  • 能有 0 ~ 多個
  • 合格條件: intent 中的 data 為 intent-filter 宣告的之一


. Updated on 2014/02/18


* Reference
- Android Intent Filter-判斷intent傳遞對象 - kei chueng - 博客园
- Intent Filter
- android -- 應用程式自我介紹之intent resolution @ 心的距離 :: 痞客邦 PIXNET ::
- <action>
- <category>
- <data>

沒有留言:

張貼留言