鸿蒙学习实战之路-Share Kit系列(8/17)-获取分享结果与状态监听
·
鸿蒙学习实战之路-Share Kit系列(8/17)-获取分享结果与状态监听
最近好多朋友问我:“西兰花啊,我想知道用户分享到哪里了,分享成功还是失败,但不知道代码怎么写?” 害,这问题可问对人了!
今天这篇,我就手把手带你实现获取分享结果功能,从零到一,全程不超过 5 分钟(不含调试时间)~
分享结果是啥?
分享结果就是用户完成分享后,系统返回给你的信息,包括:
- 分享状态:成功、失败、取消
- 分享目标:分享到的应用或设备
- 分享渠道:系统操作名称或应用组件标识
有了这些信息,你就能知道用户分享到哪里了,分享是否成功,然后根据结果做相应的处理。
如何监听分享完成事件?
Share Kit 提供了 on 方法,可以监听分享完成事件。
完整代码示例
import { common } from '@kit.AbilityKit';
import { systemShare } from '@kit.ShareKit';
// 步骤1:构造分享数据
let shareData: systemShare.SharedData = new systemShare.SharedData({
utd: 'general.text',
uri: 'file://.../xxx.txt',
title: '分享文本',
preview: 'file://.../preview.jpg',
description: '这是一段分享文本'
});
// 步骤2:构建分享控制器
let controller: systemShare.ShareController = new systemShare.ShareController(shareData);
// 步骤3:注册分享完成事件监听
controller.on('shareCompleted', (result: systemShare.ShareResult) => {
console.log(`分享完成,结果:${result}`);
});
// 步骤4:显示分享面板
let uiContext: UIContext = this.getUIContext();
let context: common.UIAbilityContext = uiContext.getHostContext() as common.UIAbilityContext;
controller.show(context, {
previewMode: systemShare.SharePreviewMode.DEFAULT,
selectionMode: systemShare.SelectionMode.SINGLE
});
ShareResult 参数详解
ShareResult 是分享结果的描述信息,包含以下参数:
| 参数 | 类型 | 说明 |
|---|---|---|
| resultCode | number | 分享结果的代码,0 表示成功,非 0 表示失败 |
| resultMessage | string | 分享结果的消息,比如"分享成功"、“分享失败” |
| target | string | 分享目标的标识,比如应用包名或设备 ID |
🥦 西兰花小贴士:
resultCode 的值可以用来判断分享是否成功,0 表示成功,非 0 表示失败。你可以根据不同的 resultCode 做不同的处理。
在实际项目中怎么用?
上面的代码是基础实现,但在实际项目中,你可能会这样用:
示例:监听分享结果并提示用户
import { common } from '@kit.AbilityKit';
import { systemShare } from '@kit.ShareKit';
import { promptAction } from '@kit.ArkUI';
@Entry
@Component
struct ShareResultPage {
// 分享文本
shareText: string = '这是一段分享文本';
// 分享文本并监听结果
onShareTextWithResult() {
// 构造分享数据
let shareData: systemShare.SharedData = new systemShare.SharedData({
utd: 'general.text',
uri: 'file://.../xxx.txt',
title: '分享文本',
description: this.shareText
});
// 构建分享控制器
let controller: systemShare.ShareController = new systemShare.ShareController(shareData);
// 注册分享完成事件监听
controller.on('shareCompleted', (result: systemShare.ShareResult) => {
if (result.resultCode === 0) {
promptAction.showToast({
message: '分享成功',
duration: 2000
});
} else {
promptAction.showToast({
message: `分享失败:${result.resultMessage}`,
duration: 2000
});
}
});
// 显示分享面板
let uiContext: UIContext = this.getUIContext();
let context: common.UIAbilityContext = uiContext.getHostContext() as common.UIAbilityContext;
controller.show(context, {
previewMode: systemShare.SharePreviewMode.DEFAULT,
selectionMode: systemShare.SelectionMode.SINGLE
});
}
build() {
Column() {
Text('监听分享结果示例')
.fontSize(20)
.fontWeight(FontWeight.Bold)
.margin(20)
.fontColor(Color.Black);
Text(this.shareText)
.fontSize(16)
.margin({ left: 20, right: 20, bottom: 20 })
.fontColor(Color.Gray);
Button('分享文本(监听结果)')
.onClick(() => {
this.onShareTextWithResult();
})
.margin(20);
}
.width('100%')
.height('100%');
}
}
示例:记录分享行为
import { common } from '@kit.AbilityKit';
import { systemShare } from '@kit.ShareKit';
@Entry
@Component
struct ShareAnalyticsPage {
// 分享文本
shareText: string = '这是一段分享文本';
// 分享文本并记录行为
onShareTextWithAnalytics() {
// 构造分享数据
let shareData: systemShare.SharedData = new systemShare.SharedData({
utd: 'general.text',
uri: 'file://.../xxx.txt',
title: '分享文本',
description: this.shareText
});
// 构建分享控制器
let controller: systemShare.ShareController = new systemShare.ShareController(shareData);
// 注册分享完成事件监听
controller.on('shareCompleted', (result: systemShare.ShareResult) => {
// 记录分享行为
console.log(`分享目标:${result.target}`);
console.log(`分享结果:${result.resultCode === 0 ? '成功' : '失败'}`);
console.log(`分享消息:${result.resultMessage}`);
// 这里可以调用你的统计 SDK,记录分享行为
// 比如:Analytics.track('share', { target: result.target, result: result.resultCode });
});
// 显示分享面板
let uiContext: UIContext = this.getUIContext();
let context: common.UIAbilityContext = uiContext.getHostContext() as common.UIAbilityContext;
controller.show(context, {
previewMode: systemShare.SharePreviewMode.DEFAULT,
selectionMode: systemShare.SelectionMode.SINGLE
});
}
build() {
Column() {
Text('记录分享行为示例')
.fontSize(20)
.fontWeight(FontWeight.Bold)
.margin(20)
.fontColor(Color.Black);
Text(this.shareText)
.fontSize(16)
.margin({ left: 20, right: 20, bottom: 20 })
.fontColor(Color.Gray);
Button('分享文本(记录行为)')
.onClick(() => {
this.onShareTextWithAnalytics();
})
.margin(20);
}
.width('100%')
.height('100%');
}
}
🥦 西兰花小贴士:
记录分享行为可以帮助你了解用户的分享习惯,比如用户最喜欢分享到哪里,分享成功率是多少等。这些数据对产品优化很有帮助。
如何取消监听?
如果你不再需要监听分享完成事件,可以调用 off 方法取消监听。
示例:取消监听
import { common } from '@kit.AbilityKit';
import { systemShare } from '@kit.ShareKit';
// 定义回调函数
let shareCompletedCallback = (result: systemShare.ShareResult) => {
console.log(`分享完成,结果:${result}`);
};
// 注册分享完成事件监听
controller.on('shareCompleted', shareCompletedCallback);
// 取消分享完成事件监听
controller.off('shareCompleted', shareCompletedCallback);
🥦 西兰花警告:
我有个朋友忘记取消监听,结果每次分享都会触发多次回调,debug 了两小时才发现是内存泄漏问题!血泪教训啊朋友们!
常见问题
Q1:监听回调没有触发怎么办?
检查以下几点:
-
是否正确注册了监听:
- 确认是否在显示分享面板前注册了监听
- 确认事件名称是否正确(
shareCompleted)
-
是否正确获取了 UIAbility 上下文对象:
- 确认是否正确获取了 UIAbility 上下文对象
- 确认上下文对象是否有效
Q2:如何区分不同的分享结果?
可以通过 resultCode 来区分不同的分享结果:
controller.on('shareCompleted', (result: systemShare.ShareResult) => {
switch (result.resultCode) {
case 0:
console.log('分享成功');
break;
case 1:
console.log('分享失败');
break;
case 2:
console.log('用户取消分享');
break;
default:
console.log('未知错误');
break;
}
});
Q3:如何处理分享失败的情况?
分享失败时,可以根据 resultMessage 提示用户,并记录错误日志:
controller.on('shareCompleted', (result: systemShare.ShareResult) => {
if (result.resultCode !== 0) {
// 提示用户
promptAction.showToast({
message: `分享失败:${result.resultMessage}`,
duration: 2000
});
// 记录错误日志
console.error(`分享失败:${result.resultMessage}`);
}
});
下一步学什么?
看完这篇,你应该已经能获取分享结果了。接下来可以深入学习:
- 共享联系人到推荐区:让分享更精准
- 目标应用接入:让你的应用能接收其他应用分享的内容
- 高级功能:碰一碰分享、隔空传送
- 常见问题:分享失败、数据类型不支持等问题的解决方案
推荐资料
📚 官方文档:
我是盐焗西兰花,
不教理论,只给你能跑的代码和避坑指南。
下期见!🥦
更多推荐


所有评论(0)