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

Android 組件通信:Activity 間數據傳遞 vs 直接持有引用——效能與安全性權衡

     編輯:程式設計綜合問答

場景定義

兩個類 A、B(實為兩個 Activity)。A 需要給 B 的某個變數賦值。
方案一:A 中 new B() 建立實例,直接 b.field = value。
方案二:A 透過 Intent.putExtra(...) 傳遞,B 在 onCreate 中 getIntent().getExtra(...) 接收。

核心結論:方案二(Intent 傳值)是 Android 規範且正確的做法

詳細對比

維度方案一:直接 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。
  • 同一 Application 進程內多 Fragment/Activity 共享資料:優先使用 ViewModel (SharedViewModel) 或 Repository 單例,避免序列化開銷。

總結

**「Android 推薦機制」即最佳實踐。** 直接 new Activity() 屬於嚴重架構錯誤,面試、代碼審查、生產環境均會被駁回。請堅定使用 Intent + Parcelable/Serializable 或現代 ViewModel 方案。

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