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

如何避免Cordova应用放入车载支架时重启(处理运行时变更)

解决Cordova应用车载支架触发重启的问题

第一步:修改AndroidManifest.xml

首先你需要在应用的AndroidManifest.xml中,给主Activity添加android:configChanges属性,告诉系统你要自行处理uiMode的配置变更,这样系统就不会在该变更发生时重启Activity了:

<activity
    android:name=".MainActivity"
    android:configChanges="uiMode|orientation|screenSize|keyboardHidden" <!-- 保留你需要的配置项,核心是添加uiMode -->
    ...>
    ...
</activity>

注:如果之前已经配置过其他configChanges项,只需要把uiMode追加进去即可,不用替换原有内容。

第二步:重写onConfigurationChanged方法

接下来需要在你的MainActivity.java(路径一般是platforms/android/app/src/main/java/[你的包名]/)中重写onConfigurationChanged方法,实现仅忽略uiMode变更且不触发应用重启的逻辑:

import android.content.res.Configuration;
import org.apache.cordova.CordovaActivity;

public class MainActivity extends CordovaActivity {
    // ... 保留原有代码 ...

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        // 获取当前旧的uiMode配置
        int oldUiMode = getResources().getConfiguration().uiMode;
        // 获取新的uiMode配置
        int newUiMode = newConfig.uiMode;
        
        // 判断是否是uiMode发生了变更
        if ((oldUiMode ^ newUiMode) != 0) {
            // 这里处理车载支架触发的uiMode变更,直接返回不执行默认逻辑,避免重启
            // 如果需要通知Web端或做少量UI调整,可以在这里添加自定义逻辑
            return;
        }
        
        // 其他配置变更(比如屏幕旋转)交给Cordova默认逻辑处理
        super.onConfigurationChanged(newConfig);
    }
}

简化版可选方案

如果你不需要区分具体的uiMode类型,也可以用更简洁的写法,直接拦截uiMode变更:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    // 仅忽略uiMode变更,其他配置变更走默认流程
    if ((newConfig.uiMode & Configuration.UI_MODE_TYPE_MASK) != getResources().getConfiguration().uiMode) {
        return;
    }
    super.onConfigurationChanged(newConfig);
}

内容的提问来源于stack exchange,提问作者Ti Smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:04:27