首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android Intent 啟動模式全解析:顯式 Intent vs 隱式 Intent

     編輯:程式設計綜合問答

核心概念

Intent (意圖) 是 Android 組件間通訊的媒介,描述「想做什麼動作」及「涉及什麼資料」。啟動 `Activity` 有兩種根本方式:

方式一:顯式 Intent (Explicit Intent)

直接指定目標組件類名,系統**不進行解析**,直接啟動該組件。適用於**應用內部**頁面跳轉、Service 啟動、Broadcast 發送。

// 代碼構建
Intent intent = new Intent(this, TargetActivity.class); // Context + Class 對象
// 或組件名字串 (跨應用需知晓完整包名)
intent.setComponent(new ComponentName("com.other.app", "com.other.app.TargetActivity"));
startActivity(intent);

Manifest 配置: 目標 `Activity` 僅需標準宣告,**無需 ``**。

<activity android:name=".TargetActivity" />
特點說明
耦合度高 (編譯期依賴目標類 / 包名)
安全性高 (僅啟動指定組件,不可被攔截)
效能最快 (無解析開銷)
適用場景App 內跳轉、啟動自家 Service/Receiver、精確喚起第三方 App 特定頁面

方式二:隱式 Intent (Implicit Intent)

宣告動作、類別、資料**,由系統**根據 `` 匹配**可處理的組件。適用於**跨應用協作** (拍照、分享、撥號、開啟網頁)、多應用可選場景。

// 代碼構建
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("https://example.com"));
intent.addCategory(Intent.CATEGORY_BROWSABLE);
// 或自訂 Action
Intent intent = new Intent("com.myapp.action.CUSTOM_ACTION");
startActivity(intent);

Manifest 配置 (目標端): 必須宣告 `` 接收匹配條件。

<activity android:name=".TargetActivity">
    <intent-filter>
        <action android:name="com.myapp.action.CUSTOM_ACTION" />
        <category android:name="android.intent.category.DEFAULT" /> <!-- 隱式啟動必加 -->
        <data android:scheme="https" />
    </intent-filter>
</activity>
特點說明
耦合度低 (發送端不知目標具體類)
彈性高 (用戶可選多個應用完成動作)
安全性需注意 (敏感 Action 應加 `android:exported="false"` 或簽名權限保護)
效能稍慢 (PackageManager 解析匹配)
適用場景系統標準動作 (ACTION_VIEW, SEND, DIAL...)、第三方擴展點、插件化架構

進階:Intent 解析流程與優先級

  1. 收集裝置上所有 `exported="true"` 且含 `` 的組件。
  2. 依 **Action 匹配** → **Category 全部包含** → **Data (URI/MIME) 匹配** 過濾。
  3. 若剩餘多個,系統彈出 **Chooser (選擇器)** 讓用戶決定 (除非 `setPackage` 限定包名)。
  4. 優先級:`` (較高優先被預設選中),但不影響 Chooser 顯示順序。

安全最佳實踐

  • **內部組件**:`android:exported="false"` (預設) + **顯式 Intent** 啟動。
  • **對外開放組件**:`android:exported="true"` + **隱式 Intent** + **自訂權限** (`android:permission="com.myapp.perm.ACCESS"`) 保護敏感操作。
  • **Android 12+ (API 31)**:`exported` 屬性**強制聲明**,否則安裝失敗。

總結對照表

維度顯式 Intent隱式 Intent
指定目標Class / ComponentNameAction + Category + Data
Manifest 需求無需 filter必須配置 filter
跨應用需知完整包名類名標準協作方式
用戶選擇無 (直接啟動)有 (Chooser)
典型用例`startActivity(new Intent(this, B.class))``startActivity(new Intent(Intent.ACTION_SEND))`

掌握兩者差異與適用邊界,是 Android 四大組件協作設計的基石。

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