如何让两个继承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时:
FirstFlutterActivity触发onPause,执行detachFromActivity(),引擎与当前页面解绑;SecondFlutterActivity启动,通过provideFlutterEngine获取全局引擎;SecondFlutterActivity触发onResume,执行attachToActivity(),引擎绑定到新页面;- 此时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
相关产品推荐
相关产品推荐

