Android原生集成Flutter SDK后FlutterEngine缓存丢失恢复问题
解决Android集成Flutter时进程重启后的FlutterEngine缓存异常问题
问题场景与原因
场景:原生Android项目集成Flutter SDK,进入Flutter模块时创建并缓存FlutterEngine;当应用被最小化后被系统强制杀死(开发者设置后台限制为“无后台进程”),从应用图标重新打开时,系统尝试恢复之前的FlutterActivity,但此时
FlutterEngineCache中已无缓存的engine,抛出如下异常:AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.appandroid/io.flutter.embedding.android.FlutterActivity}: java.lang.IllegalStateException: The requested cached FlutterEngine did not exist in the FlutterEngineCache: 'flutter_engine' 04-26 16:11:29.999 24228 24228 E AndroidRuntime: Caused by: java.lang.IllegalStateException: The requested cached FlutterEngine did not exist in the FlutterEngineCache: 'flutter_engine' 04-26 16:11:29.999 24228 24228 E AndroidRuntime: at io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.setupFlutterEngine(FlutterActivityAndFragmentDelegate.java:246) 04-26 16:11:29.999 24228 24228 E AndroidRuntime: at io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.onAttach(FlutterActivityAndFragmentDelegate.java:181) 04-26 16:11:29.999 24228 24228 E AndroidRuntime: at io.flutter.embedding.android.FlutterActivity.onCreate(FlutterActivity.java:495)原因:进程被杀死后,内存中所有缓存(包括
FlutterEngineCache)都会被清空。系统恢复FlutterActivity时,会优先尝试获取缓存的engine,若此时自定义初始化逻辑滞后于FlutterActivity的内部流程,就会触发异常。
解决方案
1. 重写FlutterActivity,提前初始化缓存Engine
在自定义FlutterActivity子类中,在调用super.onCreate()前检查并初始化FlutterEngine,确保缓存存在:
public class MyFlutterActivity extends FlutterActivity { private static final String ENGINE_ID = "flutter_engine"; @Override protected void onCreate(Bundle savedInstanceState) { // 提前检查缓存,不存在则创建并缓存 if (!FlutterEngineCache.getInstance().contains(ENGINE_ID)) { FlutterEngine flutterEngine = new FlutterEngine(this); // 预加载Flutter入口 flutterEngine.getDartExecutor().executeDartEntrypoint( DartExecutor.DartEntrypoint.createDefault() ); FlutterEngineCache.getInstance().put(ENGINE_ID, flutterEngine); } // 明确指定使用缓存的Engine getIntent().putExtra(FlutterActivity.EXTRA_CACHED_ENGINE_ID, ENGINE_ID); super.onCreate(savedInstanceState); } }
2. 拦截进程重启后的Activity恢复流程
当进程被杀死后从图标打开应用时,直接启动原生主界面,避免系统尝试恢复不存在Engine的FlutterActivity:
public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); // 判断是否为进程重启(非最近列表恢复) boolean isProcessRestarted = !getIntent().getBooleanExtra("is_restored_from_recent", false); if (isProcessRestarted) { Intent intent = new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); } } }
同时在所有Activity的onSaveInstanceState中添加恢复标记:
@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); getIntent().putExtra("is_restored_from_recent", true); }
3. 改用FlutterFragment,灵活控制Engine生命周期
将Flutter模块嵌入原生Fragment,在宿主Activity中管理Engine的创建与缓存,确保Activity恢复时Engine已就绪:
public class FlutterHostActivity extends AppCompatActivity { private static final String ENGINE_ID = "flutter_engine"; private FlutterEngine flutterEngine; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_flutter_host); // 初始化并缓存Engine if (!FlutterEngineCache.getInstance().contains(ENGINE_ID)) { flutterEngine = new FlutterEngine(this); flutterEngine.getDartExecutor().executeDartEntrypoint( DartExecutor.DartEntrypoint.createDefault() ); FlutterEngineCache.getInstance().put(ENGINE_ID, flutterEngine); } // 添加FlutterFragment if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction() .replace(R.id.flutter_container, FlutterFragment.withCachedEngine(ENGINE_ID).build()) .commit(); } } @Override protected void onDestroy() { // 可选:若无需长期缓存,在宿主销毁时释放Engine // FlutterEngineCache.getInstance().remove(ENGINE_ID); // flutterEngine.destroy(); super.onDestroy(); } }
关键注意事项
- 核心原则是让FlutterEngine的初始化早于FlutterActivity/Fragment的缓存检查逻辑。
- 跨进程重启的状态不能依赖内存缓存,需通过SharedPreferences、Room等持久化存储。
- 测试时务必开启开发者选项“无后台进程”限制,模拟真实场景。
内容的提问来源于stack exchange,提问作者Aman
相关产品推荐
相关产品推荐

