Android 14切换系统语言导致应用进程终止问题求助
Android 14 语言切换后进程终止导致 ViewModel 状态丢失
我开发的Android应用在Android 13及以下版本中,切换设备语言后可正常运行。但适配Android 14后,将应用置于后台切换语言再返回时,ViewModel中的状态变为null,日志显示应用进程已终止,无法定位变更点,现附上Manifest部分代码:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> <application android:name=PLACEHOLDER android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label=PLACEHOLDER android:localeConfig="@xml/locales_config" android:networkSecurityConfig="@xml/network_security_config" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme=PLACEHOLDER android:usesCleartextTraffic="true" tools:targetApi="31"> <activity android:name=".MainActivity" android:configChanges="layoutDirection|locale|keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" android:exported="true" android:resizeableActivity="false" android:screenOrientation="portrait" android:windowSoftInputMode="adjustResize"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <meta-data android:name="android.app.lib_name" android:value="" /> </activity> </application> </manifest>
问题分析与解决办法
Android 14 语言变更的行为差异
Android 14对配置变更的处理逻辑有调整,即便在configChanges中声明了locale,当应用处于后台时,系统仍可能因内存优先级低而直接终止进程,而非触发Activity的onConfigurationChanged。这是导致ViewModel状态丢失的核心原因——进程重启后,原ViewModel的内存状态被清空。确保状态持久化
必须将ViewModel中的关键状态通过SavedStateHandle存储,而非仅依赖内存:class MyViewModel(private val savedStateHandle: SavedStateHandle) : ViewModel() { val myState = savedStateHandle.getLiveData<String>("KEY_MY_STATE") fun updateState(newState: String) { savedStateHandle.set("KEY_MY_STATE", newState) } }若使用Jetpack Compose,配合
rememberSaveable保存界面状态,避免进程重启后状态丢失。优化Manifest配置
- 补充
configChanges的配置项:Android 14中语言切换可能伴随fontScale的隐性变更,建议添加该配置,减少系统触发进程重启的概率:android:configChanges="layoutDirection|locale|fontScale|keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" - 更新
tools:targetApi为34(Android 14对应的API等级),避免低版本的兼容限制影响高版本行为:tools:targetApi="34"
- 补充
检查localeConfig完整性
确认@xml/locales_config中包含所有应用支持的语言代码,Android 14对locale配置的校验更严格,配置缺失可能导致系统强制重启应用以加载新语言资源。排查进程终止原因
通过adb日志过滤ActivityManager的输出,明确进程被终止的具体原因(如低内存、配置变更强制重启):adb logcat -s ActivityManager
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

