Intent (意圖) 是 Android 組件間通訊的媒介,描述「想做什麼動作」及「涉及什麼資料」。啟動 `Activity` 有兩種根本方式:
直接指定目標組件類名,系統**不進行解析**,直接啟動該組件。適用於**應用內部**頁面跳轉、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 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 | 隱式 Intent |
|---|---|---|
| 指定目標 | Class / ComponentName | Action + Category + Data |
| Manifest 需求 | 無需 filter | 必須配置 filter |
| 跨應用 | 需知完整包名類名 | 標準協作方式 |
| 用戶選擇 | 無 (直接啟動) | 有 (Chooser) |
| 典型用例 | `startActivity(new Intent(this, B.class))` | `startActivity(new Intent(Intent.ACTION_SEND))` |
掌握兩者差異與適用邊界,是 Android 四大組件協作設計的基石。