先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新HarmonyOS鸿蒙全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip204888 (备注鸿蒙)
正文
开发步骤
- 需要申请
ohos.permission.DISTRIBUTED_DATASYNC
权限,配置方式请参见配置文件权限声明。 - 同时需要在应用首次启动时弹窗向用户申请授权,使用方式请参见向用户申请授权。
- 如果已有后台服务,请直接进入下一步;如果没有,则 实现一个后台服务 。
- 连接一个后台服务。
- 实现IAbilityConnection接口。IAbilityConnection提供了以下方法供开发者实现:onConnect()是用来处理连接Service成功的回调,onDisconnect()是用来处理Service异常终止的回调,onFailed()是用来处理连接Service失败的回调。
- 设置目标组件参数,包括目标设备ID、Bundle名称、Ability名称。
- 调用connectServiceExtensionAbility发起连接。
- 连接成功,收到目标设备返回的服务句柄。
- 进行跨设备调用,获得目标端服务返回的结果。
import rpc from ‘@ohos.rpc’;
import Want from ‘@ohos.app.ability.Want’;
import common from ‘@ohos.app.ability.common’;
import { BusinessError } from ‘@ohos.base’;
@Entry
@Component
struct PageName {
private context = getContext(this) as common.UIAbilityContext;
build() {
// …
Button(‘connectServiceExtensionAbility’)
.onClick(()=>{
const REQUEST_CODE = 99;
let want: Want = {
“deviceId”: getRemoteDeviceId(),
“bundleName”: “com.example.myapplication”,
“abilityName”: “ServiceExtAbility”
};
// 建立连接后返回的Id需要保存下来,在解绑服务时需要作为参数传入
let connectionId = this.context.connectServiceExtensionAbility(want,
{
onConnect(elementName, remote) {
console.info(‘onConnect callback’);
if (remote === null) {
console.info(onConnect remote is null
);
return;
}
let option = new rpc.MessageOption();
let data = new rpc.MessageSequence();
let reply = new rpc.MessageSequence();
data.writeInt(1);
data.writeInt(99); // 开发者可发送data到目标端应用进行相应操作
// @param code 表示客户端发送的服务请求代码。
// @param data 表示客户端发送的{@link MessageSequence}对象。
// @param reply 表示远程服务发送的响应消息对象。
// @param options 指示操作是同步的还是异步的。
//
// @return 如果操作成功返回{@code true}; 否则返回 {@code false}。
remote.sendMessageRequest(REQUEST_CODE, data, reply, option).then((ret: rpc.RequestResult) => {
let msg = reply.readInt(); // 在成功连接的情况下,会收到来自目标端返回的信息(100)
console.info(sendRequest ret:${ret} msg:${msg}
);
}).catch((error: BusinessError) => {
console.info(‘sendRequest failed’);
});
},
onDisconnect(elementName) {
console.info(‘onDisconnect callback’);
},
onFailed(code) {
console.info(‘onFailed callback’);
}
});
})
}
}
getRemoteDeviceId方法参照 通过跨设备启动uiability和serviceextensionability组件实现多端协同无返回数据 。
- 断开连接。调用disconnectServiceExtensionAbility()断开与后台服务的连接。
import common from ‘@ohos.app.ability.common’;
import { BusinessError } from ‘@ohos.base’;
@Entry
@Component
struct PageName {
private context = getContext(this) as common.UIAbilityContext;
build() {
// …
Button(‘disconnectServiceExtensionAbility’)
.onClick(()=>{
let connectionId: number = 1 // 在通过connectServiceExtensionAbility绑定服务时返回的Id
this.context.disconnectServiceExtensionAbility(connectionId).then(() => {
console.info(‘disconnectServiceExtensionAbility success’);
}).catch((error: BusinessError) => {
console.error(‘disconnectServiceExtensionAbility failed’);
})
})
}
}
通过跨设备Call调用实现多端协同
跨设备Call调用的基本原理与设备内Call调用相同,请参见 通过Call调用实现UIAbility交互(仅对系统应用开放)。
下面介绍跨设备Call调用实现多端协同的方法。
接口说明
表4 Call API接口功能介绍
接口名 | 描述 |
---|---|
startAbilityByCall(want: Want): Promise; | 启动指定UIAbility至前台或后台,同时获取其Caller通信接口,调用方可使用Caller与被启动的Ability进行通信。 |
on(method: string, callback: CalleeCallBack): void | 通用组件Callee注册method对应的callback方法。 |
off(method: string): void | 通用组件Callee解注册method的callback方法。 |
call(method: string, data: rpc.Parcelable): Promise | 向通用组件Callee发送约定序列化数据。 |
callWithResult(method: string, data: rpc.Parcelable): Promise<rpc.MessageSequence> | 向通用组件Callee发送约定序列化数据, 并将Callee返回的约定序列化数据带回。 |
release(): void | 释放通用组件的Caller通信接口。 |
on(type: “release”, callback: OnReleaseCallback): void | 注册通用组件通信断开监听通知。 |
开发步骤
- 需要申请
ohos.permission.DISTRIBUTED_DATASYNC
权限,配置方式请参见 配置文件权限声明 。 - 同时需要在应用首次启动时弹窗向用户申请授权,使用方式请参见 向用户申请授权 。
- 创建被调用端UIAbility。 被调用端UIAbility需要实现指定方法的数据接收回调函数、数据的序列化及反序列化方法。在需要接收数据期间,通过on接口注册监听,无需接收数据时通过off接口解除监听。
- 配置UIAbility的启动模式。 配置module.json5,将CalleeAbility配置为单实例”singleton”。
Json字段 | 字段说明 |
---|---|
“launchType” | Ability的启动模式,设置为”singleton”类型。 |
UIAbility配置标签示例如下:
“abilities”:[{
“name”: “.CalleeAbility”,
“srcEntry”: “./ets/CalleeAbility/CalleeAbility.ts”,
“launchType”: “singleton”,
“description”: “
s
t
r
i
n
g
:
C
a
l
l
e
e
A
b
i
l
i
t
y
_
d
e
s
c
"
,
"
i
c
o
n
"
:
"
string:CalleeAbility\_desc", "icon": "
string:CalleeAbility_desc","icon":"media:icon”,
“label”: “$string:CalleeAbility_label”,
“exported”: true
}]
- 导入UIAbility模块。
import UIAbility from ‘@ohos.app.ability.UIAbility’;
- 定义约定的序列化数据。 调用端及被调用端发送接收的数据格式需协商一致,如下示例约定数据由number和string组成。
import rpc from ‘@ohos.rpc’
class MyParcelable {
num: number = 0;
str: string = “”;
constructor(num: number, string: string) {
this.num = num;
this.str = string;
}
marshalling(messageSequence: rpc.MessageSequence) {
messageSequence.writeInt(this.num);
messageSequence.writeString(this.str);
return true;
}
unmarshalling(messageSequence: rpc.MessageSequence) {
this.num = messageSequence.readInt();
this.str = messageSequence.readString();
return true;
}
}
- 实现Callee.on监听及Callee.off解除监听。 如下示例在Ability的onCreate注册MSG_SEND_METHOD监听,在onDestroy取消监听,收到序列化数据后作相应处理并返回。应用开发者根据实际业务需要做相应处理。
import rpc from ‘@ohos.rpc’;
import Want from ‘@ohos.app.ability.Want’;
import UIAbility from ‘@ohos.app.ability.UIAbility’;
import AbilityConstant from ‘@ohos.app.ability.AbilityConstant’;
const TAG: string = ‘[CalleeAbility]’;
const MSG_SEND_METHOD: string = ‘CallSendMsg’;
function sendMsgCallback(data: rpc.MessageSequence): MyParcelable {
console.info(‘CalleeSortFunc called’);
// 获取Caller发送的序列化数据
let receivedData: MyParcelable = new MyParcelable(0, ‘’);
data.readParcelable(receivedData);
console.info(receiveData[${receivedData.num}, ${receivedData.str}]
);
// 作相应处理
// 返回序列化数据result给Caller
return new MyParcelable(Number(receivedData.num) + 1, send ${receivedData.str} succeed
);
}
export default class CalleeAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
try {
this.callee.on(MSG_SEND_METHOD, sendMsgCallback);
} catch (error) {
console.info(${MSG_SEND_METHOD} register failed with error ${JSON.stringify(error)}
);
}
}
onDestroy() {
try {
this.callee.off(MSG_SEND_METHOD);
} catch (error) {
console.error(TAG, ${MSG_SEND_METHOD} unregister failed with error ${JSON.stringify(error)}
);
}
}
}
- 获取Caller接口,访问被调用端UIAbility。
- 导入UIAbility模块。
import UIAbility from ‘@ohos.app.ability.UIAbility’;
- 获取Caller通信接口。 Ability的context属性实现了startAbilityByCall方法,用于获取指定通用组件的Caller通信接口。如下示例通过this.context获取Ability实例的context属性,使用startAbilityByCall拉起Callee被调用端并获取Caller通信接口,注册Caller的onRelease和onRemoteStateChange监听。应用开发者根据实际业务需要做相应处理。
import UIAbility, { Caller } from ‘@ohos.app.ability.UIAbility’;
import { BusinessError } from ‘@ohos.base’;
export default class EntryAbility extends UIAbility {
// …
async onButtonGetRemoteCaller() {
let caller: Caller|undefined;
let context = this.context;
context.startAbilityByCall({
deviceId: getRemoteDeviceId(),
bundleName: ‘com.samples.CallApplication’,
abilityName: ‘CalleeAbility’
}).then((data) => {
if (data != null) {
caller = data;
console.info(‘get remote caller success’);
// 注册caller的release监听
caller.onRelease((msg) => {
console.info(remote caller onRelease is called ${msg}
);
})
console.info(‘remote caller register OnRelease succeed’);
// 注册caller的协同场景下跨设备组件状态变化监听通知
try {
caller.onRemoteStateChange((str) => {
console.info('Remote state changed ’ + str);
});
} catch (error) {
console.info(‘Caller.onRemoteStateChange catch error, error.code: ${JSON.stringify(error.code)}, error.message: ${JSON.stringify(error.message)}’);
}
}
}).catch((error: BusinessError) => {
console.error(get remote caller failed with ${error}
);
})
}
// …
}
getRemoteDeviceId方法参照 通过跨设备启动uiability和serviceextensionability组件实现多端协同无返回数据 。
- 向被调用端UIAbility发送约定序列化数据。
1.向被调用端发送Parcelable数据有两种方式,一种是不带返回值,一种是获取被调用端返回的数据,method以及序列化数据需要与被调用端协商一致。如下示例调用Call接口,向Callee被调用端发送数据。
import UIAbility, { Caller } from ‘@ohos.app.ability.UIAbility’;
import { BusinessError } from ‘@ohos.base’;
const MSG_SEND_METHOD: string = ‘CallSendMsg’;
export default class EntryAbility extends UIAbility {
// …
caller: Caller|undefined;
async onButtonCall() {
try {
let msg: MyParcelable = new MyParcelable(1, ‘origin_Msg’);
if (this.caller) {
await this.caller.call(MSG_SEND_METHOD, msg);
}
} catch (error) {
console.info(caller call failed with ${error}
);
}
}
// …
}
- 如下示例调用CallWithResult接口,向Callee被调用端发送待处理的数据originMsg,并将’CallSendMsg’方法处理完毕的数据赋值给backMsg。
import UIAbility, { Caller } from ‘@ohos.app.ability.UIAbility’;
import rpc from ‘@ohos.rpc’;
const MSG_SEND_METHOD: string = ‘CallSendMsg’;
let originMsg: string = ‘’;
let backMsg: string = ‘’;
export default class EntryAbility extends UIAbility {
// …
caller: Caller|undefined;
async onButtonCallWithResult(originMsg: string, backMsg: string) {
try {
let msg: MyParcelable = new MyParcelable(1, originMsg);
if (this.caller) {
const data = await this.caller.callWithResult(MSG_SEND_METHOD, msg);
console.info(‘caller callWithResult succeed’);
let result: MyParcelable = new MyParcelable(0, ‘’);
data.readParcelable(result);
backMsg = result.str;
console.info(caller result is [${result.num}, ${result.str}]
);
}
} catch (error) {
console.info(caller callWithResult failed with ${error}
);
}
}
// …
}
- 释放Caller通信接口。 Caller不再使用后,应用开发者可以通过release接口释放Caller。
import UIAbility, { Caller } from ‘@ohos.app.ability.UIAbility’;
export default class EntryAbility extends UIAbility {
caller: Caller|undefined;
releaseCall() {
try {
if (this.caller) {
this.caller.release();
this.caller = undefined;
}
console.info(‘caller release succeed’);
} catch (error) {
console.info(caller release failed with ${error}
);
}
}
}
为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05
《鸿蒙开发学习手册》:
如何快速入门:https://qr21.cn/FV7h05
- 基本概念
- 构建第一个ArkTS应用
- ……
开发基础知识:https://qr21.cn/FV7h05
- 应用基础知识
- 配置文件
- 应用数据管理
- 应用安全管理
- 应用隐私保护
- 三方应用调用管控机制
- 资源分类与访问
- 学习ArkTS语言
- ……
基于ArkTS 开发:https://qr21.cn/FV7h05
- Ability开发
- UI开发
- 公共事件与通知
- 窗口管理
- 媒体
- 安全
- 网络与链接
- 电话服务
- 数据管理
- 后台任务(Background Task)管理
- 设备管理
- 设备使用信息统计
- DFX
- 国际化开发
- 折叠屏系列
- ……
鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH
鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH
1.项目开发必备面试题
2.性能优化方向
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注鸿蒙)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
s://qr18.cn/F781PH`]( )
鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH
1.项目开发必备面试题
2.性能优化方向
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注鸿蒙)
[外链图片转存中…(img-HRSzisYR-1713646627163)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!