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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 14:42:15