如何避免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
相关产品推荐
相关产品推荐

