news 2026/4/21 20:34:38

基本设置模块 Cordova 与 OpenHarmony 混合开发实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基本设置模块 Cordova 与 OpenHarmony 混合开发实战

欢迎大家加入开源鸿蒙跨平台开发者社区,一起共建开源鸿蒙跨平台生态。

📌 概述

基本设置模块为用户提供了配置应用全局行为的入口,包括应用语言、货币单位、默认排序方式、首页展示内容等。模块同时打通了 Web 层配置面板与 OpenHarmony 原生偏好存储,实现“前端 UI 修改 → 原生持久化 → 全局生效”的完整链路。所有设置项都被集中保存在settings表和原生Preferences,应用启动时会统一加载并应用,保证行为一致。通过合理的分组与默认值设计,用户既可以开箱即用,也能根据自己的喝茶习惯和地区偏好进行深入定制。

🔗 完整流程

第一步:加载与合并配置

当用户打开“基本设置”页面时,前端会先从 IndexedDB 的settings表加载已有配置,如果是首次启动则返回空集合。随后通过 Cordova 调用SettingsBridge原生插件,从 OpenHarmony 的Preferences中读取系统级设置(例如是否允许使用系统深色模式、是否允许原生通知等),将两部分配置进行合并,得到一份“当前生效配置”。这一过程同时会填充表单默认值,例如语言下拉框选中“简体中文”、货币单位选中“CNY”、默认排序方式选中“按时间倒序”等,让用户一眼看到当前真实状态。

第二步:用户修改与即时预览

设置页上的每一个表单控件都绑定了本地状态,当用户修改语言、货币、默认页面或是否启用提示音等选项时,会立刻更新内存中的配置对象。部分设置(如默认排序方式、是否显示统计卡片)会直接在当前 Web 页面中即时生效,用于提供预览效果;而另一些需要重启或重新渲染的设置(如语言切换)则会给出“重启后生效”的提示。为了避免频繁写入数据库,前端会在“应用设置”按钮点击时集中提交一次,将所有变更打包发送给本地 IndexedDB 和原生插件。

第三步:持久化与全局应用

当用户点击“保存设置”时,前端会调用db.saveSettings(settings)将配置保存到 IndexedDB 中,并通过cordova.exec调用SettingsBridge.saveNativeSettings()在原生侧写入Preferences。随后,主应用在下次启动或主动刷新配置时,会统一从本地数据库和 Preferences 加载这些设置,并应用到导航、统计模块、主题模块等多个子系统中,确保全局行为与用户选择保持一致。对于影响原生行为的选项(如是否允许震动提醒),原生插件会在注册通知或振动前读取对应配置,做到真正“按设置行事”。

🔧 Web 代码实现

基本设置页面 HTML 结构

<divid="basic-settings-page"class="page"><divclass="page-header"><h1>基本设置</h1></div><formid="settings-form"class="form"><divclass="form-group"><labelfor="setting-language">界面语言</label><selectid="setting-language"name="language"><optionvalue="zh-CN">简体中文</option><optionvalue="en-US">English</option></select></div><divclass="form-group"><labelfor="setting-currency">货币单位</label><selectid="setting-currency"name="currency"><optionvalue="CNY">人民币 (CNY)</option><optionvalue="USD">美元 (USD)</option><optionvalue="EUR">欧元 (EUR)</option></select></div><divclass="form-group"><labelfor="setting-default-page">默认首页</label><selectid="setting-default-page"name="defaultPage"><optionvalue="dashboard">仪表板</option><optionvalue="record-list">记录列表</option><optionvalue="trend-analysis">趋势分析</option></select></div><divclass="form-group"><label>启动时加载统计卡片</label><labelclass="switch"><inputtype="checkbox"id="setting-load-stats"name="loadStats"><spanclass="slider"></span></label></div><divclass="form-group"><label>启用震动反馈</label><labelclass="switch"><inputtype="checkbox"id="setting-haptics"name="haptics"><spanclass="slider"></span></label><smallclass="form-text">需要系统支持,原生层将根据此开关决定是否调用震动服务。</small></div><divclass="form-actions"><buttontype="button"class="btn btn-secondary"onclick="resetSettingsForm()">恢复默认</button><buttontype="submit"class="btn btn-primary">保存设置</button></div></form></div>

这段 HTML 定义了“基本设置”页面的主要表单项:包括语言、货币、默认首页、是否加载统计卡片以及是否启用震动反馈等。使用select和自定义switch组件的组合,可以保持页面风格统一,同时保证键盘和可访问性友好。settings-form表单稍后会在 JavaScript 中绑定submit事件以集中处理保存逻辑,而“恢复默认”按钮则用于一键回退到系统推荐设置。

设置加载、编辑与保存逻辑

letcurrentSettings={language:'zh-CN',currency:'CNY',defaultPage:'dashboard',loadStats:true,haptics:true};asyncfunctioninitBasicSettingsPage(){try{constsaved=awaitdb.getSettings();if(saved){currentSettings={...currentSettings,...saved};}if(window.cordova){cordova.exec(native=>{currentSettings={...currentSettings,...native};fillSettingsForm();},()=>fillSettingsForm(),'SettingsBridge','loadNativeSettings',[]);}else{fillSettingsForm();}document.getElementById('settings-form').addEventListener('submit',handleSettingsSubmit);}catch(error){console.error('Failed to init settings page:',error);showToast('加载设置失败','error');fillSettingsForm();}}functionfillSettingsForm(){document.getElementById('setting-language').value=currentSettings.language;document.getElementById('setting-currency').value=currentSettings.currency;document.getElementById('setting-default-page').value=currentSettings.defaultPage;document.getElementById('setting-load-stats').checked=!!currentSettings.loadStats;document.getElementById('setting-haptics').checked=!!currentSettings.haptics;}asyncfunctionhandleSettingsSubmit(event){event.preventDefault();constform=document.getElementById('settings-form');constformData=newFormData(form);constnewSettings={language:formData.get('language')||'zh-CN',currency:formData.get('currency')||'CNY',defaultPage:formData.get('defaultPage')||'dashboard',loadStats:formData.get('loadStats')==='on',haptics:formData.get('haptics')==='on'};try{awaitdb.saveSettings(newSettings);currentSettings=newSettings;if(window.cordova){cordova.exec(()=>console.log('Native settings saved'),err=>console.error('Save native settings error:',err),'SettingsBridge','saveNativeSettings',[newSettings]);}showToast('设置已保存','success');}catch(error){console.error('Failed to save settings:',error);showToast('保存失败,请重试','error');}}functionresetSettingsForm(){currentSettings={language:'zh-CN',currency:'CNY',defaultPage:'dashboard',loadStats:true,haptics:true};fillSettingsForm();showToast('已恢复默认设置,仅在保存后生效','info');}

上面这段 JavaScript 代码实现了基本设置的整个前端流程:initBasicSettingsPage()先从 IndexedDB 读取已有配置,再尝试从原生层加载补充设置,然后调用fillSettingsForm()将合并后的配置填入表单。handleSettingsSubmit()在表单提交时收集用户输入、写回settings表,并通过SettingsBridge.saveNativeSettings同步到 ArkTS 原生层。resetSettingsForm()则简单重置为一组约定好的默认值,并提示用户需要点击“保存设置”后才会真正持久化。

🔌 OpenHarmony 原生代码(ArkTS)

SettingsBridge:Preferences 持久化与读取

// entry/src/main/ets/plugins/SettingsBridge.etsimportpreferencesfrom'@ohos.data.preferences';constPREF_NAME='tea_app_settings';exportclassSettingsBridge{staticasyncloadNativeSettings():Promise<Record<string,unknown>>{constpref=awaitpreferences.getPreferences(globalThis.context,PREF_NAME);constlanguage=awaitpref.get('language','zh-CN')asstring;constcurrency=awaitpref.get('currency','CNY')asstring;constdefaultPage=awaitpref.get('defaultPage','dashboard')asstring;constloadStats=awaitpref.get('loadStats',true)asboolean;consthaptics=awaitpref.get('haptics',true)asboolean;return{language,currency,defaultPage,loadStats,haptics};}staticasyncsaveNativeSettings(settings:Record<string,unknown>):Promise<void>{constpref=awaitpreferences.getPreferences(globalThis.context,PREF_NAME);if(settings.language!==undefined){awaitpref.put('language',settings.languageasstring);}if(settings.currency!==undefined){awaitpref.put('currency',settings.currencyasstring);}if(settings.defaultPage!==undefined){awaitpref.put('defaultPage',settings.defaultPageasstring);}if(settings.loadStats!==undefined){awaitpref.put('loadStats',!!settings.loadStats);}if(settings.haptics!==undefined){awaitpref.put('haptics',!!settings.haptics);}awaitpref.flush();}}

这个 ArkTS 插件SettingsBridge使用 OpenHarmony 的preferences存储提供了一个轻量级的原生设置中心:loadNativeSettings()负责从PREF_NAME指定的偏好文件中读取键值对,如果不存在就返回默认值;saveNativeSettings()则将来自 Web 层的设置写入 Preferences 并flush()到磁盘。由于键名与 Web 侧的字段一一对应,序列化和反序列化都保持非常直接,减少了出错空间。

📝 总结

基本设置模块将喝茶记录应用从“硬编码配置”升级为“用户可配置应用”。通过 Web 表单与 ArkTS Preferences 的组合,语言、货币、默认首页、是否加载统计以及是否启用震动反馈等关键行为都可以由用户自行选择并长期保存。Cordova 在这里扮演了桥梁角色:一端是 HTML/CSS/JavaScript 构建的设置界面,另一端则是 OpenHarmony 的持久化能力与系统特性。未来如果需要扩展更多设置项(例如主题色、图表引擎选择、数据自动同步开关),只需在现有表单与SettingsBridge的基础上按相同模式扩展即可,整个架构已经为此做好了准备。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 15:51:05

基于GD32的直流无刷电机控制算法实现和验证

目录 1 项目概述 1.1 项目背景 1.2 系统功能介绍 1.3 系统使用的技术要点 2 系统硬件框架结构 2.1 电机PWM接口 2.2 电流采样接口 2.3 编码器接口 3 驱动程序实现 3.1 PWM 功能实现 3.1.1 PWM接口配置 3.1.2 验证PWM输出波形 3.2 AS5600的驱动 3.2.1 AS5600与MCU之…

作者头像 李华
网站建设 2026/4/16 13:28:58

Win10 系统备份与还原实用指南:3 种方法筑牢数据安全防线

在数字化时代&#xff0c;电脑里的系统文件、工作文档、个人资料等都是核心资产&#xff0c;一旦遭遇硬件故障、病毒攻击或误操作&#xff0c;数据丢失可能造成不小损失。Windows 10 自带了实用的备份还原工具&#xff0c;同时也有更高效的第三方方案&#xff0c;下面就为大家精…

作者头像 李华
网站建设 2026/4/21 20:01:39

EHR+AI助手:远程办公模式下HR与IT的合规协同方案

摘要&#xff1a;随着数字经济的深度发展&#xff0c;远程办公已从应急选项升级为企业运营的战略配置&#xff0c;但其带来的跨地域用工、数据流转、流程管控等问题&#xff0c;对HR与IT部门的协同合规提出了严峻挑战。EHR系统作为人力资源数字化的核心载体&#xff0c;与AI助手…

作者头像 李华
网站建设 2026/4/20 9:33:44

《jQuery UI API 文档》

《jQuery UI API 文档》 引言 jQuery UI 是一个基于 jQuery 的用户界面库,它提供了丰富的交互组件和效果,帮助开发者快速构建出具有丰富交互体验的网页应用。本文档将详细介绍 jQuery UI 的 API,包括其组件、方法和事件,旨在帮助开发者更好地理解和运用 jQuery UI。 一、…

作者头像 李华
网站建设 2026/4/15 14:59:49

还在用 Figma 画饼?我用这个平台,把原型上线从 3 天压到 3 分钟

作为一名产品经理&#xff0c;我最怕听到的话就是“这个需求排满了&#xff0c;下周吧”。一个在会议上让所有人兴奋的灵感&#xff0c;在漫长的排期和等待中&#xff0c;逐渐变得平庸和乏味。我曾经以为&#xff0c;这是无法改变的宿命。直到我发现&#xff0c;原来我可以自己…

作者头像 李华
网站建设 2026/4/17 8:40:46

夸克网盘下载不限速_在线解析站

今天教大家一招能解决夸克网盘限制的在线工具。这个工具也是完全免费使用的。下面让大家看看我用这个工具的下载速度咋样。地址获取&#xff1a;放在这里了&#xff0c;可以直接获取 这个速度还是不错的把。对于平常不怎么下载的用户还是很友好的。下面开始今天的教学 输入我给…

作者头像 李华