首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Android Intent 匹配機制源碼深度解析:從 PackageManagerService 到 IntentResolver 查詢全流程

     編輯:Java 相關知識

Intent 是 Android 組件通信的核心,匹配邏輯隱藏在 PackageManagerService (PMS) 與 IntentResolver 中。本文從顯式/隱式 Intent 區別、IntentFilter 解析存儲、PMS 掃描 APK 建立索引、查詢入口 queryIntentActivities、四輪過濾匹配、buildResolveList 最終裁決五大維度,憑藉源碼還原完整匹配鏈路。

Intent 兩大類型

  • 顯式 Intent: setComponent / setClassName 鎖定目標組件,直接跳轉,無匹配過程。
  • 隱式 Intent: 僅聲明 Action、Data、Category,由系統根據 IntentFilter 解析匹配。

PMS 掃描建立索引

// PackageManagerService.java 掃描 APK 時
for (PackageParser.Activity a : pkg.activities) {
    mActivities.addActivity(a, "activity"); // mActivities: ActivityIntentResolver
}

ActivityIntentResolver 內部維護四張索引表(ArrayMap<String, F[]>):

  • mActionToFilter:纯 Action 匹配。
  • mTypedActionToFilter:Action + MIME Type。
  • mSchemeToFilter:URI Scheme。
  • mTypeToFilter / mWildTypeToFilter / mBaseTypeToFilter:MIME 精確/通配/基類型。

查詢入口與分發

// ApplicationPackageManager → PMS
public List<ResolveInfo> queryIntentActivities(Intent intent, int flags) {
    ComponentName comp = intent.getComponent();
    if (comp != null) { // 顯式
        return Collections.singletonList(buildResolveInfo(getActivityInfo(comp)));
    }
    // 隱式
    return mActivities.queryIntent(intent, resolvedType, flags, userId);
}

IntentResolver.queryIntent 四輪過濾

  1. MIME 精確匹配: mTypeToFilter.get(resolvedType)。
  2. MIME 通配匹配: mWildTypeToFilter.get(baseType)(如 image/*)。
  3. 基類型通配: mBaseTypeToFilter.get(baseType)。
  4. Scheme 匹配: mSchemeToFilter.get(scheme)。
  5. 無 Data 時純 Action 匹配: mActionToFilter.get(action)。

每輪獲得的候選 F[] 進入 buildResolveList 進一步校驗 Category、權限、優先級,最終排序輸出。

關鍵源碼類關係圖

PackageManagerService
  └─ mActivities: ActivityIntentResolver (extends IntentResolver<ActivityIntentInfo, ResolveInfo>)
        ├─ mActionToFilter, mTypedActionToFilter, mSchemeToFilter, mTypeToFilter...
        └─ queryIntent() → 四輪切分 → buildResolveList() → sortResults()

工程啟示

  • 導出組件的 IntentFilter 越精確(Action+Category+Data),匹配越快、越不易誤觸發。
  • 隱式 Intent 啟動涉及 IPC + 索引查找 + 多輪過濾,性能敏感場景優先顯式 Intent。
  • CATEGORY_DEFAULT 是隱式啟動 Activity 的隱性要求,必須在 Filter 中聲明。

掌握匹配源碼,能從根上解決「為什麼我的 Activity 沒被喚起」「為什麼彈出選擇器」等疑難雜症。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved