You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让两个继承FlutterActivity的Android Activity共用一个FlutterEngine?

实现两个FlutterActivity共用同一FlutterEngine的方案

核心思路

把FlutterEngine封装成全局单例,让两个Activity共享这个实例,然后通过重写Activity生命周期方法,手动控制引擎的附加与分离,确保可见的Activity持有引擎的绑定权。


1. 创建全局FlutterEngine单例

先写一个单例类来持有引擎实例,用Application上下文初始化避免内存泄漏,同时预执行Dart入口提前初始化引擎:

class FlutterEngineHolder private constructor(context: Context) {
    val flutterEngine: FlutterEngine

    init {
        flutterEngine = FlutterEngine(context.applicationContext).apply {
            // 预初始化Dart主入口
            dartExecutor.executeDartEntrypoint(
                DartExecutor.DartEntrypoint.createDefault()
            )
        }
    }

    companion object {
        @Volatile
        private var instance: FlutterEngineHolder? = null

        fun getInstance(context: Context): FlutterEngineHolder {
            return instance ?: synchronized(this) {
                instance ?: FlutterEngineHolder(context).also { instance = it }
            }
        }
    }
}

2. 自定义FlutterActivity控制引擎绑定

两个继承FlutterActivity的页面都需要重写以下方法,替换默认的引擎创建逻辑:

重写引擎提供方法

告诉Activity不要自行创建引擎,使用全局单例:

class FirstFlutterActivity : FlutterActivity() {
    private lateinit var engineHolder: FlutterEngineHolder

    override fun onCreate(savedInstanceState: Bundle?) {
        engineHolder = FlutterEngineHolder.getInstance(applicationContext)
        super.onCreate(savedInstanceState)
    }

    override fun provideFlutterEngine(context: Context): FlutterEngine? {
        return engineHolder.flutterEngine
    }
}

SecondFlutterActivity做完全相同的处理即可。

控制引擎的附加与分离时机

在生命周期方法里手动处理引擎的绑定状态,确保可见Activity持有引擎:

override fun onPause() {
    // 页面失去焦点时,从当前Activity分离引擎
    engineHolder.flutterEngine.detachFromActivity()
    super.onPause()
}

override fun onResume() {
    super.onResume()
    // 页面恢复可见时,将引擎附加到当前Activity
    engineHolder.flutterEngine.attachToActivity(this, lifecycle)
}

阻止引擎被销毁

FlutterActivity默认会在onDestroy时销毁引擎,需要重写方法避免这个行为:

override fun cleanUpFlutterEngine(engine: FlutterEngine) {
    // 空实现,保留引擎实例用于复用
}

3. 切换Activity的流程示例

从FirstFlutterActivity启动SecondFlutterActivity时:

  1. FirstFlutterActivity触发onPause,执行detachFromActivity(),引擎与当前页面解绑;
  2. SecondFlutterActivity启动,通过provideFlutterEngine获取全局引擎;
  3. SecondFlutterActivity触发onResume,执行attachToActivity(),引擎绑定到新页面;
  4. 此时Flutter引擎的生命周期完全跟随SecondFlutterActivity,UI渲染在新页面上。

注意事项

  • 内存泄漏防护:在Application的onTerminate方法中手动销毁引擎,避免APP退出后引擎残留:
    class MyApplication : Application() {
        override fun onTerminate() {
            super.onTerminate()
            FlutterEngineHolder.getInstance(this).flutterEngine.destroy()
        }
    }
    
  • 状态保留:复用引擎会保留Flutter侧的所有状态(如页面栈、变量值),如果需要切换页面时重置状态,可通过MethodChannel在Flutter侧监听页面切换事件处理;
  • 生命周期同步:attachToActivity传入当前Activity的lifecycle,确保引擎的暂停/恢复和页面生命周期同步。

内容的提问来源于stack exchange,提问作者user18084770

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 23:25:17