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

如何阻止Jasonette打包的Android应用在设备横竖屏切换时页面重载

Jasonette打包应用横竖屏切换页面重载问题修复方案

问题根因

Android系统默认规则下,屏幕方向、屏幕尺寸等设备配置发生变更时,会销毁当前前台Activity并重新创建实例。Jasonette封装的WebView实例会随Activity重建重新加载页面,该逻辑属于原生层控制,因此原Web应用不存在该问题。

修复方法

方法1:修改AndroidManifest.xml配置(最高优先级推荐)

找到打包后Android项目中的AndroidManifest.xml文件,定位到承载WebView的Activity节点,添加android:configChanges属性:

<activity
    android:name="io.jasonette.seed.Core.JasonViewActivity"
    android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|uiMode"
    android:label="@string/app_name" >
    <!-- 其余原有配置保持不变 -->
</activity>

添加该属性后,系统不会再销毁重建Activity,而是回调onConfigurationChanged方法由应用自行处理配置变更,WebView不会触发重载。

方法2:固定屏幕方向(不需要横竖屏切换场景适用)

如果你的应用不需要支持横竖屏切换,可以直接在Jasonette的app.json全局配置中固定屏幕方向,从根源避免配置变更:

{
  "$jason": {
    "head": {
      "options": {
        "orientation": "portrait"
      }
    }
  }
}

可选值说明:portrait为固定竖屏,landscape为固定横屏。

方法3:自定义WebView状态保存(兜底方案)

如果上述方案不适用,可修改Jasonette原生代码,在Activity销毁前保存WebView状态,重建时恢复避免完全重载:

  1. 重写onSaveInstanceState方法保存状态:
@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    webView.saveState(outState);
}
  1. 在onCreate方法中恢复状态:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 初始化WebView代码保持不变
    if (savedInstanceState != null) {
        webView.restoreState(savedInstanceState);
    } else {
        webView.loadUrl("你的Web应用访问地址");
    }
}

注意事项

修改android:configChanges属性后,如果你有横竖屏不同的UI布局需求,需要自行在onConfigurationChanged方法中处理布局适配逻辑,系统不再自动切换对应布局资源。

内容的提问来源于stack exchange,提问作者Avner Moshkovitz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 12:45:00