Android NativeActivity变更系统语言时崩溃重启的原因与解决方法
这是Android的预期行为吗?
是的,这属于Android的预期行为。系统语言切换属于系统配置变更(Configuration Change)的范畴,当这类会影响应用资源适配的配置发生变化时,Android默认会销毁当前Activity并重新创建,确保应用能加载对应新配置的资源(如语言字符串、适配布局等)。
如何避免此类Activity重建?
可以通过以下几种方式解决:
在Manifest中声明忽略指定配置变更
在Game Activity的<activity>标签内添加android:configChanges属性,明确标记不需要触发Activity重建的配置项。针对语言切换场景,需要包含locale(兼容旧版本)和layoutDirection(API 17+,语言切换可能伴随布局方向变化),如果还有其他不想触发重建的场景(如屏幕旋转),也可以一并添加。示例配置:<activity android:name=".GameActivity" android:configChanges="locale|layoutDirection|orientation|screenSize"> <!-- 其他属性 --> </activity>配置后,系统遇到这些变更时不会销毁Activity,而是会触发
onConfigurationChanged()回调(对应NativeActivity的APP_CMD_CONFIG_CHANGED命令),你只需在该回调中手动处理资源适配(比如重新加载语言资源),无需重建整个Vulkan上下文。手动保存并恢复Vulkan核心状态
如果无法完全忽略配置变更,可在Activity销毁前(通过onSaveInstanceState()或Native层的APP_CMD_SAVE_STATE),将Vulkan的关键状态(如设备参数、交换链配置、渲染管线信息、游戏进度数据等)保存到Bundle或本地文件;在Activity重建后,从保存的状态中恢复这些数据,跳过从头初始化Vulkan的流程,大幅缩短恢复时间。这种方法复杂度较高,适合必须适配部分配置变更的场景。改用单Activity架构(可选)
若应用架构允许,可将Launch和Game的逻辑整合到同一个Activity的不同Fragment中。即使遇到配置变更,Activity重建的成本可通过Fragment的状态保存机制降低,同时能更灵活地管理界面切换,避免多Activity间的重建问题。但这需要调整现有架构,适合有重构计划的情况。
内容的提问来源于stack exchange,提问作者Bungles

