如何阻止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状态,重建时恢复避免完全重载:
- 重写
onSaveInstanceState方法保存状态:
@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); webView.saveState(outState); }
- 在
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
相关产品推荐
相关产品推荐

