一个网站的主题和设计风格,户县规划建设和住房保障局网站,南宁专业网站制作前十排名,广西营销型网站公司用户首选项为应用提供Key-Value键值型的数据处理能力#xff0c;支持应用持久化轻量级数据#xff0c;并对其修改和查询。数据存储形式为键值对#xff0c;键的类型为字符串型#xff0c;值的存储数据类型包括数字型、字符型、布尔型以及这3种类型的数组类型。 在上一篇中支持应用持久化轻量级数据并对其修改和查询。数据存储形式为键值对键的类型为字符串型值的存储数据类型包括数字型、字符型、布尔型以及这3种类型的数组类型。 在上一篇中对Preference实例进行封装实现LocalStorage相关功能并在基础上再增加对json对象数据存储能力还实现了数据缓存具有时效性等功能。地址HarmonyOS开发 - 本地持久化之实现LocalStorage实例-CSDN博客 不过LocalStorage示例为单例模式当在多个Ability或多module情况下不希望所有数据都存储在一个Preferences实例中这就需要LocalStorage有支持多实例的能力。
一、Ability和Module 在HarmonyOS开发中Ability是应用或服务所具备的能力的抽象它可以响应用户的操作与用户进行交互。一个Module可以包含一个或多个Ability。HarmonyOS提供了两种应用模式FAFeature Ability模型和Stage模型。 FA模型从API7开始支持但已不再是主推的模型。而Stage模型从API 9开始新增是目前主推且会长期演进的模型。在Stage模型中Ability分为两种组件类型
UIAbility组件包含UI界面提供展示UI的能力主要用于和用户交互。ExtensionAbility组件提供特定场景的扩展能力满足更多的使用场景。当前仅OpenHarmony工程支持使用ExtensionAbility组件。 在HarmonyOS中应用可以设计为包含多个Ability或者多个module这取决于应用的复杂性和模块化需求。
1.1 多个Ability 一个应用可以包含多个Ability每个Ability代表应用的一种能力。Ability分为Feature AbilityFA和Particle AbilityPA两种类型。FA是有UI界面的能力用于与用户交互例如一个页面或一个服务。PA是后台运行的能力可以是Service Ability或Data Ability用于提供后台任务或数据访问的能力。在Stage模型中Ability进一步细分为UIAbility组件和ExtensionAbility组件其中UIAbility组件包含UI界面而ExtensionAbility组件提供特定场景的扩展能力。 多个Ability
1.2 多个module 在HarmonyOS中应用可以被分解为多个功能模块每个模块负责执行特定的功能。这些模块可以是Shared Library、Static Library或Visual Library。Shared Library是HSPHarmony Shared Package动态共享包Static Library是HARHarmony Archive静态共享包。模块化设计提高了代码的可理解性和可复用性使应用的扩展和维护变得更为简便同时降低了系统各部分之间的耦合度。 多个Module 1.3 二者选择 对于多应用的情况你可以选择使用多个Ability或多个module这取决于你的应用架构和业务需求。如果应用功能较为独立且需要在不同应用间共享那么可能更适合使用多个module。每个module可以包含一个或多个Ability这样可以在不同的module之间实现功能的解耦和复用。如果应用的功能较为集中且主要通过不同的页面或服务来提供用户交互那么使用多个Ability可能更为合适。 在实际开发中你可以根据应用的特点和需求灵活选择使用多个Ability或多个module或者将两者结合起来以实现最佳的应用架构和性能。 二、LocalStorage升级 在前一篇地址HarmonyOS开发 - 本地持久化之实现LocalStorage实例-CSDN博客中封装的LocalStorage类创建Preferences实例时指定的实例名称用的是Module模块名称context.abilityInfo.moduleName在了解Ability和Module关系后决定将实例名称更新为Ability名称context.abilityInfo.name。
2.1 LocalStorage类 这里将LocalStorageObj文件复制一份在新文件中增加多实例功能同时applicationability和Productability的Ability界面和pages页面中引入的模块地址也需要同步修改为../utils/LocalStorageMulti。 这里只需要在之前LocalStorage类基础上增加一个静态变量用于存储键值对的实例和一个创建实例的静态函数即可。
键值对的存储器multiPreferences变量利用Map对象的特性键key为string类型用于存储ability名称值value为LocalStorge类型用于存储类的实例对象。创建实例函数multiInstance()函数通过Map对象中has()方法判断该对应的ability界面实例是否存在不存在则创建并返回创建的LocalStorage实例若存在则直接返回该键对应的LocalStorage实例。 示例代码如下
import common from ohos.app.ability.common
import preferences from ohos.data.preferences
import { isJsonObject } from ./utils// 定义存储值类型
type valueType string | number | boolean
// 定义json对象存储类型
type dataType { value: valueType | object, expire: number }/*** 定义LocalStorage类*/
export class LocalStorage {private preference: preferences.Preferences // 用户首选项实例对象// 定义多Preferences实例 存储变量字段private static multiPreferences: Mapstring, LocalStorage new Map()/*** 创建多实例* param context*/static multiInstance(context?: common.UIAbilityContext): LocalStorage {const name context.abilityInfo.name// 如果存在该实例则直接返回if(LocalStorage.multiPreferences.has(name)) {console.log(testTag context.abilityInfo.name update, name)return LocalStorage.multiPreferences.get(name)}// 如果不存在则创建实例else {console.log(testTag context.abilityInfo.name create, name)const instance new LocalStorage() // 实例LocalStorage对象instance.initial(context) // 初始化Preferences实例// 存储LocalStorage对象LocalStorage.multiPreferences.set(name, instance)// 返回实例对象return instance}}// 定义初始化函数initial(context: common.UIAbilityContext): void {// 这里将UIAbility中应用上下文的name作用为实例名称即该项目的ApplicationAbility或ProductAbilitypreferences.getPreferences(context, context.abilityInfo.name).then(preference {this.preference preferenceconsole.log(testTag, success~)}).catch(e {console.log(testTag error, e)})}// 略...
} 注意initial()函数中须将之前context.abilityinfo.moduleName修改为context.abilityinfo.name。
2.2 Ability中初始化实例 在两个Ability中引入LocalStorage模块并初始化实例。由于multiinstance()为静态函数通过LocalStorage类直接调用即可。
applicationability组件 Productability组件 2.3 page页面中获取实例 在HarmonyOS中aboutToAppear是页面生命周期中的一个关键回调它在创建自定义组件的新实例后在执行其build()函数之前执行。这个回调允许开发者在组件实例创建后改变状态变量并这些更改将在后续执行build()函数中生效。 aboutToAppear的使用场景包括但不限于
初始化页面状态变量执行数据绑定和事件监听的设置执行与页面显示相关的动画或过渡效果 总的来说aboutToAppear是HarmonyOS中管理页面生命周期的一个重要工具它提供了页面显示前执行初始化操作的能力。而且多应用环境中合理地使用多个Ability或module可以有效地组织和管理复杂的应用结构。 因此我们将通过aboutToAppear来获取本Ability界面中的LocalStorage实例对象。
applicationability界面下的pages/index.ets示例代码如下
import { LocalStorage } from ../utils/LocalStorageMulti
import common from ohos.app.ability.common
import Want from ohos.app.ability.WantEntry
Component
struct Index {State message: string private localStorage: LocalStorage // 定义变量接收本Ability界面下的LocalStorage实例对象aboutToAppear(){// 获取当前上下文的LocalStorage实例对象this.localStorage LocalStorage.multiInstance(getContext(this) as common.UIAbilityContext)}// 重置内容renderMsg(message: string | number | boolean){this.message message.toString()}build() {Row() {Column() {Row(){Text(this.message || -).fontSize(30).fontWeight(FontWeight.Bold)}.width(100%).height(150vp)Row(){// 添加相关操作按钮Button(添加).onClick(() {const testData { name: Tom, age: 18 };const expireDate new Date()// 设置为24小时后失效expireDate.setHours(expireDate.getHours() 24)// 存储数据this.localStorage.put(indexValue, testData, expireDate)this.renderMsg(add: JSON.stringify(testData))console.log(testTag add, testData)})Button(读取).onClick(() {this.localStorage.getValue(indexValue).then(value {this.renderMsg(get: (null ! value ? JSON.stringify(value) : value))console.log(testTag get, value)}).catch(err {console.log(testTag error, err)})})Button(删除).onClick(async () {this.localStorage.remove(indexValue)const value await this.localStorage.getValue(indexValue)this.renderMsg(delete: value)console.log(testTag delete, value)})Button(跳转新页面).onClick(() {const context getContext(this) as common.UIAbilityContextconst want: Want {bundleName: com.example.myapplication,abilityName: ProductAbility,moduleName: application,parameters: {instanceKey: product}}context.startAbility(want)})}.width(100%).justifyContent(FlexAlign.Center)}.width(100%)}.height(100%).alignItems(VerticalAlign.Top)}
} 对LocalStorage类进行多实例改造后数据的存储能力依然能正常执行。如下图 Productability界面下的pages/indexProduct.ets示例代码如下
import { LocalStorage } from ../utils/LocalStorageMulti
import common from ohos.app.ability.common
let index 0Entry
Component
struct Index {State message: string private localStorage: LocalStorage // 定义变量接收本Ability界面下的LocalStorage实例对象aboutToAppear(){// 获取当前上下文的LocalStorage实例对象this.localStorage LocalStorage.multiInstance(getContext(this) as common.UIAbilityContext)}// 重置内容renderMsg(message: string | number | boolean){this.message message.toString()}build() {Row() {Column() {Row(){Text(this.message || -).fontSize(30).fontWeight(FontWeight.Bold)}.width(100%).height(150vp)Row(){// 添加相关操作按钮Button(添加).onClick(() {this.localStorage.put(indexValue, index)this.renderMsg(add: index)console.log(testTag add, index)})Button(读取).onClick(() {this.localStorage.getValue(indexValue).then(value {this.renderMsg(get: (null ! value ? JSON.stringify(value) : value))console.log(testTag get, value)}).catch(err {console.log(testTag error, err)})})Button(删除).onClick(async () {this.localStorage.remove(indexValue)const value await this.localStorage.getValue(indexValue)this.renderMsg(delete: value)console.log(testTag delete, value)})}.width(100%).justifyContent(FlexAlign.Center)}.width(100%)}.height(100%).alignItems(VerticalAlign.Top)}
} 在Applicationability界面点击添加和读取后再跳转到Productability界面点击“读取”按钮看是否能获取到Applicationability界面的indexValue键对应的值。如下图显示是获取不到的虽然两则都存的键为indexValue但都存储在不能的Preferences实例中。 在Productability界面点击添加后再读取。结果如下图 2.4 multiInstance()函数 在LocalStorage实现多实例功能时对multiInstance()函数的设计是可以无须先初始化实例直接在页面中aboutToAppear回调函数并获取当前Ability界面实例。 此时我们将两个Ability中的onCreate()函数执行的LocalStorage.multiInstance()删除掉只在page页面直接获取再看下结果。 如上图初始化实例调用的函数注释掉后结果是怎样的。 如上图此时只执行了页面中的multiInstance()函数但操作结果依然是正常的不过注意的是在aboutToAppear回调函数中只是初始化LocalStorage实例是没问题的但是直接调用实例对象的put()、get()、remove()、clear()等函数可能会报错显示preference实例不在存这是因为initial()函数中是通过Promise异步回调获取的preference实例的。 所以是否需要在ability中执行初始化还是在页面中执行初始化根据实现需求而定。 2.5 总结 在多应用的环境中你可能会使用多个Ability或多个module来组织你的应用。Ability允许你创建多个具有不同功能的页面或服务而module则允许你将应用分解为多个功能模块每个模块可以包含一个或多个Ability。这样的设计有助于提高代码的可维护性和可扩展性。 该篇是为上一篇HarmonyOS开发 - 本地持久化之实现LocalStorage实例-CSDN博客的补充内容希望对大家有所帮助。