前言
难道我已经完全学习鸿蒙HarmonyOS了吗?no~~no~no,只能说我学习鸿蒙的前期 知识点在这里告一段落了,当然整个HarmonyOS是非常庞大 的,只是前期这一阶段算是完结了,后面有新的知识我再更新。在此我非常感激传智博学谷 的鸿蒙课程,我跟着它学习有完整的学习路线,同时遇到问题也能及时解决掉,学习也过程非常有趣。
一、应用状态
ArtTS提供了好几种状态用来帮助我们管理我们的全局数据
- State组件内状态
- LocalStorage-UIAbility状态(内存- 注意:和前端的区分开,它非持久化,非全应用)
- AppStorage- 应用内状态-多UIAbility共享-(内存-非持久化-退出应用同样消失)
- PersistenStroage-全局持久化状态(写入磁盘-持久化状态-退出应用 数据同样存在)
1. UIAbility内状态-LocalStorage
LocalStorage
是页面级的UI状态存储,通过 @Entry
装饰器接收的参数可以在页面内共享同一个 LocalStorage
实例。 LocalStorage
也可以在 UIAbility
内,页面间共享状态。
用法
- 创建
LocalStorage
实例:const storage = new LocalStorage({ key: value })
- 单向
@LocalStorageProp('user')
组件内可变 - 双向
@LocalStorageLink('user')
全局均可变
LocalStorage页面间共享
如果你想在UIAbility
中共享某个localStorage,可以在入口处直接初始化传入
- 可以在loadContent过程中直接传入创建的LocalStorage
const storage = LocalStorage.GetShared()
得到实例- 通过
@Entry(storage)
传入页面
2. 应用状态-AppStorage
AppStorage
是应用全局的UI状态存储,是和应用的进程绑定的,由UI框架在应用程序启动时创建,为应用程序UI状态属性提供中央存储。-注意它也是内存数据,不会写入磁盘
初始化数据:
**AppStorage.SetOrCreate(key,value)**
使用数据:
第一种用法-使用UI修饰符
- 单向
**@StorageProp(key) 变量**
组件内可变 - 双向
**@StorageLink(key) 变量**
全局均可变
第二种用法 使用API方法
**AppStorage.Get<ValueType>(key)**
获取数据**AppStorage.Set<ValueType>(key,value)**
覆盖数据**const link: SubscribedAbstractProperty<ValueType> = AppStorage.Link(key)**
覆盖数据-
**link.set(value)**
修改**link.get()**
获取
*注意:*AppStorage创建共享数据,但是应用销毁后就不存在数据了。
3. 状态持久化-PersistentStorage
PersistentStorage将选定的AppStorage属性保留在设备磁盘上。
3.1 选定持久化PersistentStorage.PersistProp()
通过PersistentStorage.PersistProp()方法指定持久化数据
语法:PersistentStorage.PersistProp('数据名',''),数据名对应AppStorage中存的数据
bash
PersistentStorage.PersistProp('mess', '')
AppStorage.SetOrCreate('mess', '共享数据')
3.2 删除持久化PersistentStorage.DeleteProp()
通过PersistentStorage.DeleteProp()方法指定删除持久化的数据
语法:PersistentStorage.DeleteProp('数据名')
arduino
PersistentStorage.DeleteProp('mess')
4.Environment:设备环境查询
开发者如果需要应用程序运行的设备的环境参数,以此来作出不同的场景判断,比如多语言,暗黑模式等,需要用到Environment设备环境查询。
Environment是ArkUI框架在应用程序启动时创建的单例对象。它为AppStorage提供了一系列描述应用程序运行状态的属性。Environment的所有属性都是不可变的(即应用不可写入) ,所有的属性都是简单类型。
*注意:*Environment设置的信息通过AppStorage获取
语法:Environment.EnvProp(属性,值)
php
Environment.EnvProp('private', '中文')
promptAction.showToast({message: AppStorage.Get('private')})
二、系统能力
1. 用户首选项-数据持久化
用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。当用户希望有一个全局唯一存储的地方,可以采用用户首选项来进行存储。
1.1 获取首选项实例
通过*preferences.getPreferences(参数1,参数2)*获取到实例,参数1是context上下文,参数2是名字,类似于数据库名
1.2 操作首选项
调用*get(名字,数据)方法进行数据获取,调用put(名字,数据)*进行数据存储,
调用*delete(名字)*进行数据删除
注意:*当对数据修改和删除以后,需要preferences.flush()*进行保存
typescript
class MessageStore {
async getStore() {
return await preferences.getPreferences(getContext(this), 'message_store')
}
async setMessageList(json: string) {
const store = await this.getStore()
await store.put('message_list', json)
await store.flush()
}
async getMessageList() {
const store = await this.getStore()
const data = await store.get('message_list', '[]') as string
return JSON.parse(data) as MessageItem[]
}
async deleteMessageList(){
const store = await this.getStore()
await store.delete('message_list')
await store.flush()
}
}
2. Canvas绘图
这其实不是系统能力部分知识点,只是我在学习系统能力的知识时穿插了Canvas的知识,所以我把它加在这里。
Canvas提供画布组件,用于自定义绘制图形。
语法:Canvas(画笔参数)
画笔settings:
settings = new ReaneringContextSettings(true)
产生画笔:
context = new CanvasRenderingContext2D()
kotlin
canvasSettings = new RenderingContextSettings(true)
canvasContext = new CanvasRenderingContext2D(this.canvasSettings)
Canvas(this.canvasContext)
.width(252)
.aspectRatio(1)
.backgroundColor('#eee')
.onReady(() => {
// this.canvasContext.strokeRect(10,10, 50,50)
// this.canvasContext.fillRect(100,100, 30,30)
this.canvasContext.rotate(45 * Math.PI / 180)
this.canvasContext.drawImage(this.imgBit,0,0,252,252)
})
3. 公共事件与通知
3.1 消息通知-NotificationManager模块
本模块提供通知管理的能力,包括发布、取消发布通知,创建、获取、移除通知通道,获取通知的使能状态、角标使能状态,获取通知的相关信息等。
Ⅰ :发布通知notificationManager.publish(request),request参数用于设置要发布通知的内容和相关配置信息。
request参数:为notificationManager.NotificationRequest类型,是描述通知的请求。内容如下:
scss
request: {
id, //通知ID
context: { // 通知内容
contentType, // 通知内容类型
normal? // 基本类型通知内容
},
wantAgent //封装了应用的行为意图,点击通知时触发该行为
}
注意:contentType有多种类型,不同类型的通知内容参数不一样,必须要一一对应。
wantAgent是一个want值,具体内容如下:
arduino
const want = wantAgent.getWantAgent({
wants:[], // 将被执行的动作列表。
operationType, // 动作类型。
requestCode // 使用者定义的一个私有值。
})
注意:wantAgent.getWantAgent()返回一个promise,所以可以使用async/await处理
示例:
php
Button('发送消息')
.onClick(async(event: ClickEvent) => {
const want = await wantAgent.getWantAgent({
wants: [
{
bundleName: "com.example.myapplication",
abilityName: "EntryAbility"
}
],
operationType: wantAgent.OperationType.START_ABILITY,
requestCode: 0
})
const info: notificationManager.NotificationRequest = {
id: this.infoId,
content: {
contentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT,
normal: {
title: "温馨提示",
text: "明天天气降温,请注意保温!",
additionalText: '天气预报'
}
},
wantAgent: want
}
notificationManager.publish(info)
})
Ⅱ :通过通知ID和通知标签取消已发布的通知notificationManager.cancel(id),id参数是通知ID
javascript
Button('取消通知').onClick((event: ClickEvent) => {
notificationManager.cancel(this.infoId)
})
3.2 后台代理提醒reminderAgentManager模块
应用退到后台或进程终止后,仍然有一些提醒用户的定时类任务。当前支持的提醒类型包括:倒计时、日历和闹钟。使用需要权限 :ohos.permission.PUBLISH_AGENT_REMINDER
Ⅰ :发布提醒(倒计时、日历或闹钟)reminderAgentManager.publishReminder(reminderReq),reminderReq参数是需要发布的提醒实例。
reminderReq参数类型与发布类型挂钩,具体如下:
reminderAgentManager.ReminderRequestCalendar 日历实例对象,用于设置提醒的时间。
reminderAgentManager.ReminderRequestAlarm 闹钟实例对象,用于设置提醒的时间。
reminderAgentManager.ReminderRequestTimer 倒计时实例对象,用于设置提醒的时间。
内容如下:
arduino
request: {
reminderType, //指明提醒类型
...一些对应时间的参数
}
注意:reminderType有多种类型,它取得类型要与reminderReq的类型一致。
yaml
Button('发布闹钟').onClick((event: ClickEvent) => {
const reminderRequest : reminderAgentManager.ReminderRequestAlarm = {
reminderType: reminderAgentManager.ReminderType.REMINDER_TYPE_ALARM,
hour: 2,
minute: 51,
daysOfWeek: [],
ringDuration: 60
}
reminderAgentManager.publishReminder(reminderRequest)
})
Ⅱ :取消指定id的提醒,reminderAgentManager.cancelReminder(id),id参数是通知ID
dart
Button('停止闹钟')
.onClick(async () => {
await reminderAgentManager.cancelReminder(this.id)
})
好了,一个阶段的学习告一段落,在接下来几天我打算把知识巩固一下,然后去找点案例敲敲练手。我的分享希望大家能喜欢。😊