news 2026/4/16 0:49:58

基本设置模块 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/15 21:09:53

Python 3 文件操作详解

Python 3 文件操作详解 引言 Python 3 作为一种强大的编程语言,在文件操作方面提供了丰富的功能。无论是读取、写入还是修改文件,Python 都能轻松应对。本文将详细介绍 Python 3 中文件操作的相关知识,包括文件打开、读取、写入、关闭等基本操作,以及文件路径处理、文件权…

作者头像 李华
网站建设 2026/4/16 7:45:05

微爱帮监狱写信寄信小程序与中国邮政焦作支局战略合作技术方案

一、合作背景微爱帮与中国邮政焦作支局达成战略合作&#xff0c;共同构建安全、可靠的监狱信件传输体系&#xff0c;确保特殊群体通信的合法合规与信息安全。二、信件安全保障方案1. 双层安全审核机制class LetterSecuritySystem:def __init__(self):self.content_scanner Con…

作者头像 李华
网站建设 2026/4/15 22:09:54

如何轻松的写一篇内容

管不住顺手刷社媒&#xff0c;那就反手写内容&#xff01;2024年做个决定&#xff0c;每周关注一个话题&#xff0c;然后写一篇内容&#xff0c;要尽量用花里胡哨的表达风格。就是为了练键盘&#xff0c;文字随便敲。如果只写专业的方向&#xff0c;固定的实践经验和思路&#…

作者头像 李华
网站建设 2026/4/16 7:42:57

GCC -fhardened 面向生产构建的安全加固落地指南

GCC 14 引入的 -fhardened 是一个面向生产环境的安全加固选项集合&#xff0c;旨在不改变 ABI 的前提下&#xff0c;系统性启用主流 Linux 平台的编译期与链接期防护能力。本文将深入解析 -fhardened 的设计目标、与 PIE/ASLR 的关系、与 LTO 的已知问题&#xff0c;以及在 CMa…

作者头像 李华
网站建设 2026/4/15 13:50:54

首尔大学团队揭秘:为什么AI绘画总是用“高斯分布“?

这项由首尔大学数据科学研究院的李俊豪、金官锡和李俊锡团队完成的研究发表于2025年12月的《机器学习研究汇刊》&#xff08;Transactions on Machine Learning Research&#xff09;&#xff0c;感兴趣的读者可以通过论文编号arXiv:2512.18184查阅完整内容。说到AI绘画&#x…

作者头像 李华