兩個類 A、B(實為兩個 Activity)。A 需要給 B 的某個變數賦值。
方案一:A 中 new B() 建立實例,直接 b.field = value。
方案二:A 透過 Intent.putExtra(...) 傳遞,B 在 onCreate 中 getIntent().getExtra(...) 接收。
| 維度 | 方案一:直接 new 持有引用 | 方案二:Intent 傳值(推薦) |
|---|---|---|
| 生命週期管理 | ❌ A 持有 B 實例 → B 無法被 GC 回收 → 記憶體洩漏。Activity 應由系統管理建立/銷毀。 | ✅ 系統負責建立 B 實例,A 僅發送意圖,無強引用殘留。 |
| 進程隔離與重建 | ❌ 若系統因記憶體不足殺死進程重建 B,A 持有的舊實例失效,數據丟失。 | ✅ Intent 可序列化持久化,進程重建時自動還原 Extras。 |
| 任務棧與啟動模式 | ❌ 繞過 launchMode(singleTop, singleTask 等),導致多實例、棧混亂。 | ✅ 完全尊重清單檔聲明的啟動模式與任務棧行為。 |
| 跨應用/組件調用 | ❌ 無法支援隱式 Intent、跨 App 調用。 | ✅ 原生支援隱式 Intent、startActivityForResult、PendingIntent 等進階場景。 |
| 效能 | 看似省去序列化,但帶來嚴重架構風險,得不償失。 | 序列化開銷極小(Parcelable/Primitive),可忽略不計。 |
| 安全性 | ❌ 直接暴露內部欄位,破壞封裝;惡意 App 可利用 exported Activity 注入數據。 | ✅ 明確定義接口(Extra keys),可加權限保護、驗證來源。 |
// A Activity
Intent intent = new Intent(ActivityA.this, ActivityB.class);
intent.putExtra(\"KEY_USER_ID\", userId);
intent.putExtra(\"KEY_USER_NAME\", userName);
startActivity(intent);
// B Activity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int userId = getIntent().getIntExtra(\"KEY_USER_ID\", -1);
String userName = getIntent().getStringExtra(\"KEY_USER_NAME\");
// 業務邏輯
}
Binder 限制(~1MB)時:使用 SharedPreferences、FileProvider、ViewModel(同進程)、ContentProvider 或 WorkManager 共享大數據,Intent 僅傳遞 URI/Key。**「Android 推薦機制」即最佳實踐。** 直接 new Activity() 屬於嚴重架構錯誤,面試、代碼審查、生產環境均會被駁回。請堅定使用 Intent + Parcelable/Serializable 或現代 ViewModel 方案。