FlutterActivity vs FlutterFragmentActivity:全面对比与最佳实践

在 Flutter 混合开发中,选择合适的 Activity 基类至关重要。本文将深入分析 FlutterActivity 和 FlutterFragmentActivity 的区别,并介绍如何集成 ViewModel 等常用功能。

  1. 核心类关系图

    Activity

    ├── FlutterActivity (直接继承)

    └── ComponentActivity

    └── FragmentActivity

    └── FlutterFragmentActivity

    ├── ViewModel 支持
    ├── LiveData 观察
    ├── Fragment 管理
    └── AppCompat 功能

  2. 基础特性对比

特性 FlutterActivity FlutterFragmentActivity

继承关系 → Activity → FragmentActivity → ComponentActivity

ViewModel 需要额外配置 ✅ 原生支持

LiveData 需要手动处理 ✅ 自动生命周期感知

Fragment ❌ 不支持 ✅ 完整支持

AppCompat ❌ 不支持 ✅ Material Design

主题样式 受限 完整 AppCompat 主题

生命周期 简单 完整的生命周期管理

使用复杂度 简单 中等

  1. ViewModel 集成方案

FlutterActivity 中的 ViewModel 集成

kotlin 复制代码
class FlutterActivityWithViewModel : FlutterActivity() {
    // 需要手动管理 ViewModel
    private lateinit var viewModel: MainViewModel
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        // 手动创建 ViewModel
        viewModel = ViewModelProvider(
            ViewModelStore(),
            ViewModelProvider.NewInstanceFactory()
        ).get(MainViewModel::class.java)
        
        setupChannels()
    }
    
    private fun setupChannels() {
        val channel = MethodChannel(flutterEngine?.dartExecutor, "app_channel")
        channel.setMethodCallHandler { call, result ->
            when (call.method) {
                "getData" -> result.success(viewModel.getData())
                else -> result.notImplemented()
            }
        }
    }
    
    // 需要手动处理生命周期
    override fun onDestroy() {
        super.onDestroy()
        // 清理资源
    }
}

FlutterFragmentActivity 中的 ViewModel 集成

kotlin 复制代码
class AdvancedFlutterActivity : FlutterFragmentActivity() {
    // 使用委托自动管理 ViewModel
    private val viewModel: MainViewModel by viewModels()
    private val sharedViewModel: SharedViewModel by viewModels()
    
    private lateinit var methodChannel: MethodChannel
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_hybrid)
        
        setupFlutterFragment()
        setupChannels()
        observeViewModels()
        setupActionBar()
    }
    
    private fun setupFlutterFragment() {
        val flutterFragment = FlutterFragment.createDefault()
        supportFragmentManager.beginTransaction()
            .replace(R.id.flutter_container, flutterFragment)
            .commit()
    }
    
    private fun setupChannels() {
        methodChannel = MethodChannel(flutterEngine.dartExecutor, "app_channel")
        methodChannel.setMethodCallHandler { call, result ->
            handleMethodCall(call, result)
        }
    }
    
    private fun handleMethodCall(call: MethodCall, result: Result) {
        when (call.method) {
            "getUserInfo" -> result.success(viewModel.userInfo.value)
            "updateSettings" -> viewModel.updateSettings(call.arguments)
            "getAppState" -> result.success(sharedViewModel.appState.value)
            else -> result.notImplemented()
        }
    }
    
    private fun observeViewModels() {
        // 自动生命周期感知的 LiveData 观察
        viewModel.userInfo.observe(this) { userInfo ->
            sendToFlutter("userInfoUpdate", userInfo)
        }
        
        viewModel.settings.observe(this) { settings ->
            updateUI(settings)
        }
        
        sharedViewModel.appState.observe(this) { state ->
            handleAppStateChange(state)
        }
    }
    
    private fun setupActionBar() {
        setSupportActionBar(findViewById(R.id.toolbar))
        supportActionBar?.title = "混合应用"
    }
    
    private fun sendToFlutter(method: String, data: Any) {
        methodChannel.invokeMethod(method, data)
    }
}
  1. ViewModel 类示例
kotlin 复制代码
class MainViewModel(application: Application) : AndroidViewModel(application) {
    
    private val _userInfo = MutableLiveData<UserInfo>()
    val userInfo: LiveData<UserInfo> = _userInfo
    
    private val _settings = MutableLiveData<Settings>()
    val settings: LiveData<Settings> = _settings
    
    private val _loading = MutableLiveData<Boolean>()
    val loading: LiveData<Boolean> = _loading
    
    init {
        loadInitialData()
    }
    
    fun updateUserInfo(newInfo: UserInfo) {
        _userInfo.value = newInfo
        // 可以在这里添加业务逻辑,如API调用
    }
    
    fun updateSettings(settings: Map<String, Any>) {
        // 处理设置更新
        _settings.value = convertToSettings(settings)
    }
    
    fun performAction(action: String) {
        viewModelScope.launch {
            _loading.value = true
            try {
                val result = repository.performAction(action)
                _userInfo.value = result
            } catch (e: Exception) {
                // 错误处理
            } finally {
                _loading.value = false
            }
        }
    }
    
    override fun onCleared() {
        super.onCleared()
        // 清理资源
    }
}

// 共享 ViewModel
class SharedViewModel : ViewModel() {
    val appState = MutableLiveData<AppState>()
    val navigation = MutableLiveData<NavigationEvent>()
}
  1. 常用功能集成对比

导航处理

FlutterActivity:

kotlin 复制代码
// 简单的 Intent 导航
startActivity(FlutterActivity.withNewEngine().build(this))

FlutterFragmentActivity:

kotlin 复制代码
// 复杂的 Fragment 导航
fun navigateToFlutter() {
    supportFragmentManager.beginTransaction()
        .replace(R.id.container, FlutterFragment.createDefault())
        .addToBackStack("flutter")
        .commit()
}

// 处理返回键
override fun onBackPressed() {
    if (supportFragmentManager.backStackEntryCount > 0) {
        supportFragmentManager.popBackStack()
    } else {
        super.onBackPressed()
    }
}

主题和样式

FlutterActivity (受限):

xml 复制代码
<style name="FlutterTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowBackground">@drawable/launch_background</item>
</style>

FlutterFragmentActivity (完整):

xml 复制代码
<style name="AppTheme" parent="Theme.Material3.DayNight">
    <item name="colorPrimary">@color/primary</item>
    <item name="colorSecondary">@color/secondary</item>
    <item name="android:statusBarColor">@color/primaryDark</item>
    <item name="actionBarTheme">@style/MyActionBar</item>
    <item name="bottomNavigationStyle">@style/BottomNavigation</item>
</style>

状态管理

FlutterActivity (手动管理):

kotlin 复制代码
class SimpleStateManager {
    private var states = mutableMapOf<String, Any>()
    
    fun saveState(key: String, value: Any) {
        states[key] = value
    }
    
    fun getState(key: String): Any? = states[key]
}

FlutterFragmentActivity (使用 ViewModel):

kotlin 复制代码
// 自动状态持久化
class StateViewModel : ViewModel() {
    private val _state = mutableStateFlow<AppState>(AppState.Idle)
    val state: StateFlow<AppState> = _state
    
    fun updateState(newState: AppState) {
        _state.value = newState
    }
}
  1. 性能与内存考量

方面 FlutterActivity FlutterFragmentActivity

启动性能 ⚡️ 更快 (~100ms) ⏳ 稍慢 (~150ms)

内存占用 📉 较低 (~30MB) 📈 较高 (~45MB)

渲染性能 🎯 优化更好 🔧 需要调优

生命周期 🟢 简单 🟡 复杂但完整

  1. 实际项目架构建议

方案一:纯 Flutter 应用

kotlin 复制代码
// 使用 FlutterActivity 作为主要入口
class MainActivity : FlutterActivity() {
    // 简单配置,快速启动
}

// 配置 AndroidManifest.xml
<activity android:name=".MainActivity">
    <meta-data android:name="io.flutter.embedding.android.NormalTheme"
               android:resource="@style/FlutterTheme"/>
</activity>

方案二:混合开发应用

kotlin 复制代码
// 使用 FlutterFragmentActivity 作为基础
class HybridAppActivity : FlutterFragmentActivity() {
    
    private val viewModel: AppViewModel by viewModels()
    private val authViewModel: AuthViewModel by viewModels()
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_hybrid)
        
        setupFragments()
        setupViewModels()
        setupNavigation()
        setupChannels()
    }
    
    private fun setupFragments() {
        // 管理多个 Fragment
        val navHostFragment = supportFragmentManager
            .findFragmentById(R.id.nav_host) as NavHostFragment
        navController = navHostFragment.navController
    }
    
    private fun setupViewModels() {
        // 观察多个 ViewModel
        viewModel.userData.observe(this) { updateUserUI(it) }
        authViewModel.authState.observe(this) { handleAuthState(it) }
    }
    
    private fun setupNavigation() {
        // 设置底部导航
        bottomNavigation.setupWithNavController(navController)
    }
    
    private fun setupChannels() {
        // 设置 Flutter 通信
        MethodChannel(flutterEngine.dartExecutor, "app_channel").apply {
            setMethodCallHandler { call, result ->
                when (call.method) {
                    "nativeFunction" -> handleNativeCall(call, result)
                    else -> result.notImplemented()
                }
            }
        }
    }
}
  1. 迁移指南

从 FlutterActivity 迁移到 FlutterFragmentActivity

  1. 修改继承关系
kotlin 复制代码
// 之前
class MyActivity : FlutterActivity()

// 之后
class MyActivity : FlutterFragmentActivity()
  1. 添加布局文件
xml 复制代码
<!-- res/layout/activity_main.xml -->
<LinearLayout>
    <androidx.appcompat.widget.Toolbar/>
    <FrameLayout android:id="@+id/flutter_container"/>
</LinearLayout>
  1. 初始化 Fragment
kotlin 复制代码
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    
    supportFragmentManager.beginTransaction()
        .replace(R.id.flutter_container, FlutterFragment.createDefault())
        .commit()
}
  1. 集成 ViewModel
kotlin 复制代码
private val viewModel: MyViewModel by viewModels()

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // 观察 LiveData
    viewModel.data.observe(this) { updateUI(it) }
}
  1. 最佳实践总结

选择 FlutterActivity 当:

· ✅ 开发纯 Flutter 应用

· ✅ 需要最快的启动速度

· ✅ 项目结构简单

· ✅ 不需要原生 UI 组件

选择 FlutterFragmentActivity 当:

· ✅ 需要混合开发

· ✅ 使用 ViewModel 和 LiveData

· ✅ 需要 Fragment 管理

· ✅ 集成原生 Android 功能

· ✅ 需要完整的主题支持

推荐架构:

复制代码
FlutterFragmentActivity
    ├── ViewModel (业务逻辑)
    ├── LiveData (状态管理)
    ├── Fragment (UI 管理)
    ├── DataBinding (可选)
    └── Navigation Component (导航)

结论

FlutterActivity 适合简单的纯 Flutter 应用,而 FlutterFragmentActivity 为混合开发提供了完整的 Android 架构组件支持。在选择时,应考虑项目的复杂度、团队的技术栈和长期维护需求。对于大多数企业级应用,推荐使用 FlutterFragmentActivity 以获得更好的可扩展性和维护性。

相关推荐
TT_Close2 小时前
【Flutter×鸿蒙】FVM 不认鸿蒙 SDK?4步手动塞进去
flutter·swift·harmonyos
雨白4 小时前
Android 快捷方式实战指南:静态、动态与固定快捷方式详解
android
hqk4 小时前
鸿蒙项目实战:手把手带你实现 WanAndroid 布局与交互
android·前端·harmonyos
TT_Close4 小时前
【Flutter×鸿蒙】一个"插队"技巧,解决90%的 command not found
flutter·harmonyos
LING4 小时前
RN容器启动优化实践
android·react native
恋猫de小郭7 小时前
Flutter 发布官方 Skills ,Flutter 在 AI 领域再添一助力
android·前端·flutter
Kapaseker12 小时前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
黄林晴12 小时前
你的 Android App 还没接 AI?Gemini API 接入全攻略
android
恋猫de小郭1 天前
2026 Flutter VS React Native ,同时在 AI 时代 VS Native 开发,你没见过的版本
android·前端·flutter
冬奇Lab1 天前
PowerManagerService(上):电源状态与WakeLock管理
android·源码阅读