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

Android 動態創建 Activity?建議改用 Fragment 模塊化加載

     編輯:程式設計綜合問答

為什麼不推薦動態創建/註冊 Activity,Fragment 才是正統替代方案

嘗試在運行時動態創建 Activity 並註冊到系統,屬於「逆框架而行」。本文分析其技術障礙,並給出基於 Fragment 的標準化架構。

動態 Activity 的三大死穴

  1. Manifest 靜態聲明:所有 Activity 必須在 AndroidManifest.xml 靜態註冊,無法運行時動態添加。
  2. 上下文隔離:動態生成的類無法被系統識別為合法組件,startActivity 會拋 ActivityNotFoundException。
  3. 生命周期失控:繞過系統管理,導致回棧、配置變更、進程回收全靠手動處理,極易內存洩漏。

網上流傳的「動態註冊」本質

僅是利用 ProxyActivity + 反射/類加載器加載插件代碼(如 VirtualAPK、Atlas 熱修復框架),本質仍是預註冊一個容器 Activity,不適合常規業務開發。

正統替代:Fragment 模塊化架構

// 單 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();
        }
    }
}

Fragment 方案優勢

維度動態 ActivityFragment 方案
系統兼容性極差,依賴 Hack原生支持,全版本穩定
生命周期管理手動維護系統自動管理
數據傳遞Intent 穿梭ViewModel / Arguments 共享
UI 復用困難天然支持嵌套、對話框、BottomSheet
動態加載類加載器隔離支持 Dynamic Feature Module (Play Feature Delivery)

進階:動態功能模塊

若確需「按需下載業務模塊」,請使用 Dynamic Feature Modules:

  1. 將業務拆分為獨立 Module(dynamicFeatures = [":feature_home", ":feature_profile"])。
  2. 運行時 SplitInstallManager 請求下載。
  3. 下載完成後,反射實例化其中的 Fragment,無缝接入主流程。

結論:放棄動態 Activity 的執念,擁抱 單 Activity + 多 Fragment + ViewModel + Navigation Component 的現代 Android 架構。

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