Android 12.0系统下Flutter应用按返回键无法正常退出问题
问题根因
- Android 12(API 31)引入了预测返回手势特性,同时调整了根Activity的生命周期调度逻辑:当用户按下返回键退出任务栈仅剩的根Activity时,系统默认不会立即销毁Activity、触发
MainActivity.onDestroy回调,而是将应用进程移入后台缓存队列,用于后续快速冷启动。仅当系统资源不足需要回收进程时,才会执行真正的销毁逻辑。 - 如果你之前的应用退出逻辑耦合在
onDestroy方法中,上述行为变更就会导致退出逻辑无法执行,出现应用无法正常退出的现象。
解决方案
方案1:将退出逻辑迁移到返回按键回调(推荐)
直接把原本放在onDestroy中的资源释放、状态清理等退出逻辑,移到返回键的处理方法中,适配所有系统版本。
传统onBackPressed写法示例:
@Override public void onBackPressed() { if (isTaskRoot()) { // 替换为你自己的应用退出逻辑:停止服务、释放全局资源、保存状态等 releaseAppResource(); finish(); return; } super.onBackPressed(); }
如果使用OnBackPressedDispatcher处理返回事件,新增对应回调即可。
方案2:强制终止进程(仅适用于无后台需求的应用)
如果按下返回键后需要彻底杀死应用进程,可在清理逻辑执行完成后调用:
// 关闭当前任务栈的所有Activity finishAffinity(); // 终止当前应用进程 android.os.Process.killProcess(android.os.Process.myPid()); System.exit(0);
警告:该方案会强行终止所有应用相关进程,不适合有后台服务、推送、小组件等后台存活需求的应用,可能导致相关功能异常。
方案3:关闭Android 12+返回缓存优化
如果不想调整现有逻辑,可直接在AndroidManifest.xml中为根Activity关闭预测返回特性,恢复旧版生命周期行为:
<activity android:name=".MainActivity" android:enableOnBackInvokedCallback="false" android:exported="true"> <!-- 原有intent-filter配置 --> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
提示:该属性仅对Android 12及以上系统生效,不会影响低版本设备的正常行为。
内容的提问来源于stack exchange,提问作者iDecode
相关产品推荐
相关产品推荐

