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 以获得更好的可扩展性和维护性。

相关推荐
ITKEY_7 小时前
flutter日期选择国际化支持
开发语言·javascript·flutter
农夫三拳_有点甜7 小时前
Flutter SystemChrome 完整指南
flutter
葱段7 小时前
【Flutter】TextField 监听长按菜单粘贴点击事件
android·flutter·dart
用户097 小时前
Gradle 现代化任务依赖方案
android·kotlin
2501_919749039 小时前
flutter鸿蒙:使用flutter_local_notifications实现本地通知
flutter·华为·harmonyos
东坡肘子9 小时前
从开放平台到受控生态:谷歌宣布 Android 开发者验证政策 | 肘子的 Swift 周报 #0101
android·swiftui·swift
脚踏实地,坚持不懈!9 小时前
ANDROID,Jetpack Compose, 贪吃蛇小游戏Demo
android
Just_Paranoid9 小时前
【JobScheduler】Android 后台任务调度的核心组件指南
android·alarmmanager·jobscheduler·workmanager
我命由我123459 小时前
Android 开发 - 一些画板第三方库(DrawBoard、FingerPaintView、PaletteLib)
android·java·java-ee·android studio·安卓·android-studio·android runtime