大结局?我完成HarmonyOS学习了?

前言

难道我已经完全学习鸿蒙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)
          })

好了,一个阶段的学习告一段落,在接下来几天我打算把知识巩固一下,然后去找点案例敲敲练手。我的分享希望大家能喜欢。😊

相关推荐
鸿蒙自习室12 小时前
鸿蒙UI开发——小图标的使用
ui·华为·harmonyos
我爱学习_zwj13 小时前
ArkTS的进阶语法-3(内置对象,String字符串对象,数组的常用方法)
前端·华为·harmonyos
lqj_本人16 小时前
鸿蒙next版开发:ArkTS组件自定义事件拦截详解
华为·harmonyos
@逆风微笑代码狗16 小时前
133.鸿蒙基础01
华为·harmonyos
我爱学习_zwj20 小时前
ArkTS的进阶语法-1(泛型,工具类型,空安全)
前端·javascript·华为·harmonyos
雪芽蓝域zzs21 小时前
HarmonyOS 沉浸式状态实现的多种方式
华为·harmonyos
lqj_本人1 天前
Flutter&鸿蒙next 使用 BLoC 模式进行状态管理详解
flutter·华为·harmonyos
呆萌很1 天前
HCIP-HarmonyOS Application Developer 习题(二十一)
harmonyos
SoraLuna1 天前
「Mac畅玩鸿蒙与硬件32」UI互动应用篇9 - 番茄钟倒计时应用
macos·ui·harmonyos
lqj_本人1 天前
flutter&鸿蒙next 使用 InheritedWidget 实现跨 Widget 传递状态
flutter·华为·harmonyos