嘗試在運行時動態創建 Activity 並註冊到系統,屬於「逆框架而行」。本文分析其技術障礙,並給出基於 Fragment 的標準化架構。
AndroidManifest.xml 靜態註冊,無法運行時動態添加。startActivity 會拋 ActivityNotFoundException。僅是利用 ProxyActivity + 反射/類加載器加載插件代碼(如 VirtualAPK、Atlas 熱修復框架),本質仍是預註冊一個容器 Activity,不適合常規業務開發。
// 單 Activity 容器
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // 含 FrameLayout container
// 根據意圖動態加載 Fragment
String fragmentTag = getIntent().getStringExtra("FRAGMENT_TAG");
loadFragment(fragmentTag);
}
private void loadFragment(String tag) {
Fragment fragment = FragmentFactory.create(tag); // 工廠模式
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.container, fragment, tag)
.commit();
}
}
// Fragment 工廠
public class FragmentFactory {
public static Fragment create(String tag) {
switch (tag) {
case "HOME": return new HomeFragment();
case "PROFILE": return new ProfileFragment();
case "SETTINGS": return new SettingsFragment();
default: return new DefaultFragment();
}
}
}
| 維度 | 動態 Activity | Fragment 方案 |
|---|---|---|
| 系統兼容性 | 極差,依賴 Hack | 原生支持,全版本穩定 |
| 生命周期管理 | 手動維護 | 系統自動管理 |
| 數據傳遞 | Intent 穿梭 | ViewModel / Arguments 共享 |
| UI 復用 | 困難 | 天然支持嵌套、對話框、BottomSheet |
| 動態加載 | 類加載器隔離 | 支持 Dynamic Feature Module (Play Feature Delivery) |
若確需「按需下載業務模塊」,請使用 Dynamic Feature Modules:
dynamicFeatures = [":feature_home", ":feature_profile"])。SplitInstallManager 請求下載。結論:放棄動態 Activity 的執念,擁抱 單 Activity + 多 Fragment + ViewModel + Navigation Component 的現代 Android 架構。