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

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配置

    1. 补充configChanges的配置项:Android 14中语言切换可能伴随fontScale的隐性变更,建议添加该配置,减少系统触发进程重启的概率:
      android:configChanges="layoutDirection|locale|fontScale|keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
      
    2. 更新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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 00:33:19