网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
- 创建一个订阅者对象或函数,用于处理接收到的消息或事件。
- 向发布者注册订阅者。这通常通过调用发布者的订阅方法,并传递订阅者对象或函数作为参数来完成。订阅方法可能会要求提供订阅的主题或类型。
- 订阅者被添加到发布者的订阅列表中,以便在有新消息或事件时通知订阅者。
- 当发布者发布消息或触发事件时,订阅者会收到通知,并执行相应的处理逻辑。
订阅者可以随时选择取消订阅,以停止接收发布者的消息。取消订阅通常通过调用发布者的取消订阅方法,并传递订阅者对象或函数作为参数来完成。
通过发布订阅模式,订阅者可以实现松耦合的消息传递,提高系统的可扩展性和灵活性。
🦋2.1 公共事件订阅概述
动态订阅是在应用运行时,动态地调用公共事件订阅的API来实现对公共事件的订阅。这种方式适用于需要根据业务逻辑动态决定是否订阅某个公共事件的情况。例如,一个电子商务应用可能在用户下单时订阅订单创建事件,但在取消订单时取消订阅。
静态订阅是通过配置文件声明和实现继承自StaticSubscriberExtensionAbility的类来实现对公共事件的订阅。这种方式适用于需要一直订阅某个公共事件而不需要动态调整订阅的情况。例如,一个日志服务可能一直订阅用户登录事件,以记录用户的登录日志。
无论是动态订阅还是静态订阅,订阅方都可以实现自己的业务逻辑来处理接收到的公共事件。例如,订阅方可以在接收到订单创建事件时,将订单信息保存到数据库中。通过订阅公共事件,应用可以实现不同模块之间的解耦和灵活的消息传递。
🦋2.2 动态订阅公共事件
注意需要申请权限
import commonEventManager from ‘@ohos.commonEventManager’;
import Base from ‘@ohos.base’;
// 用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作
let subscriber: commonEventManager.CommonEventSubscriber | null = null;
// 订阅者信息
let subscribeInfo: commonEventManager.CommonEventSubscribeInfo = {
events: [“usual.event.SCREEN_OFF”], // 订阅灭屏公共事件
}
// 创建订阅者回调
commonEventManager.createSubscriber(subscribeInfo, (err: Base.BusinessError, data: commonEventManager.CommonEventSubscriber) => {
if (err) {
console.error(Failed to create subscriber. Code is ${err.code}, message is ${err.message}
);
return;
}
console.info(‘Succeeded in creating subscriber.’);
subscriber = data;
// 订阅公共事件回调
})
// 订阅公共事件回调
if (subscriber !== null) {
commonEventManager.subscribe(subscriber, (err: Base.BusinessError, data: commonEventManager.CommonEventData) => {
if (err) {
console.error(Failed to subscribe common event. Code is ${err.code}, message is ${err.message}
);
return;
}
})
} else {
console.error(Need create subscriber
);
}
🦋2.3 静态订阅公共事件(仅对系统应用开放)
1、声明一个静态订阅者,首先需要在工程中新建一个ExtensionAbility, 该ExtensionAbility从StaticSubscriberExtensionAbility派生,其代码实现如下:
import StaticSubscriberExtensionAbility from ‘@ohos.application.StaticSubscriberExtensionAbility’
export default class StaticSubscriber extends StaticSubscriberExtensionAbility {
onReceiveEvent(event) {
console.log(‘onReceiveEvent, event:’ + event.event);
}
}
2、配置文件
{
“module”: {
…
“extensionAbilities”: [
{
“name”: “StaticSubscriber”,
“srcEntrance”: “./ets/StaticSubscriber/StaticSubscriber.ts”,
“description”: “
s
t
r
i
n
g
:
S
t
a
t
i
c
S
u
b
s
c
r
i
b
e
r
d
e
s
c
"
,
"
i
c
o
n
"
:
"
string:StaticSubscriber_desc", "icon": "
string:StaticSubscriberdesc","icon":"media:icon”,
“label”: “KaTeX parse error: Expected '}', got 'EOF' at end of input: …, "resource": "profile:subscribe”
}
]
}
]
…
}
}
属性名称 | 属性值 |
---|---|
srcEntrance | 表示ExtensionAbility的入口文件路径,即步骤2中声明的静态订阅者所在的文件路径 |
type | 表示ExtensionAbility的类型,对于静态订阅者需要声明为“staticSubscriber” |
metadata | 表示ExtensionAbility的二级配置文件信息。由于不同的ExtensionAbility类型其配置信息不尽相同,因此需要使用不同的config文件表示其具体配置信息 |
–name | 表示ExtensionAbility的类型名称,对于静态订阅类型,name必须声明为“ohos.extension.staticSubscriber”,否则无法识别为静态订阅者 |
–resource | 字段表示ExtensionAbility的配置信息路径,由开发者自行定义,在本例中表示路径为“resources/base/profile/subscribe.json" |
metadata指向的二级配置文件的通常形式如下:
{
“commonEvents”: [
{
“name”: “xxx”,
“permission”: “xxx”,
“events”:[
“xxx”
]
}
]
}
字段 | 说明 |
---|---|
name | 静态订阅ExtensionAbility的名称,需要和module.json5中声明的ExtensionAbility的name一致 |
permission | 订阅者要求的发布者需要具备的权限,对于发布了目标事件但不具备permission中声明的权限的发布者将被视为非法事件不予发布 |
events | 订阅的目标事件列表 |
修改设备系统配置文件 /etc/static_subscriber_config.json,将静态订阅应用者的包名添加至该json文件中即可
{
“xxx”,
“ohos.extension.staticSubscriber”,
“xxx”
}
🦋2.3 取消动态订阅公共事件
import commonEvent from ‘@ohos.commonEventManager’;
// subscriber为订阅事件时创建的订阅者对象
if (subscriber !== null) {
commonEvent.unsubscribe(subscriber, (err) => {
if (err) {
console.error([CommonEvent] UnsubscribeCallBack err=${JSON.stringify(err)}
)
} else {
console.info([CommonEvent] Unsubscribe
)
subscriber = null
}
})
}
3.发布
在发布订阅模型中,发布是指将消息发送到主题中。发布者通常不需要关心谁订阅了它们的消息,也不需要知道是否有订阅者。发布者只需要将消息发送到主题,然后该主题负责将消息传递给所有订阅者。
发布订阅模型可以用于实现异步通信,其中发布者和订阅者可以在互不干扰的情况下进行工作。发布者可以继续发布消息,而订阅者可以在需要时接收消息。
🦋3.1 发布不携带信息的公共事件
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!**
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新