鸿蒙学习实战之路-Share Kit系列(12/17)-判断应用是否被系统分享拉起
最近好多朋友问我:“西兰花啊,我想知道我的应用是不是被系统分享拉起的,但不知道代码怎么写?” 害,这问题可问对人了!今天这篇,我就手把手带你实现判断应用是否被系统分享拉起功能,从零到一,全程不超过 5 分钟(不含调试时间)~
鸿蒙学习实战之路-Share Kit系列(12/17)-判断应用是否被系统分享拉起
最近好多朋友问我:“西兰花啊,我想知道我的应用是不是被系统分享拉起的,但不知道代码怎么写?” 害,这问题可问对人了!
今天这篇,我就手把手带你实现判断应用是否被系统分享拉起功能,从零到一,全程不超过 5 分钟(不含调试时间)~
判断拉起方式是啥?
判断应用是否被系统分享拉起,就是区分应用是正常启动还是被分享拉起。比如:
- 用户点击应用图标启动:正常启动
- 用户从其他应用分享内容到你的应用:被分享拉起
区分这两种启动方式,可以帮助你做不同的处理,比如被分享拉起时直接显示分享内容,正常启动时显示首页。
LaunchParam 是啥?
LaunchParam 是应用启动参数,用于描述应用的启动方式。其中 launchReason 字段表示应用启动的原因。
| launchReason | 说明 |
|---|---|
LaunchReason.STARTUP |
应用正常启动 |
LaunchReason.SHARE |
应用被系统分享拉起 |
🥦 西兰花小贴士:LaunchReason 是一个枚举类型,可以直接使用 LaunchReason.SHARE 来判断应用是否被系统分享拉起。
如何判断应用是否被系统分享拉起?
在 UIAbility 的 onCreate 或 onNewWant 方法中解析 launchParam 参数,判断 launchReason 是否为 LaunchReason.SHARE。
完整代码示例
import { common } from '@kit.AbilityKit';
import { systemShare } from '@kit.ShareKit';
@Entry
@Component
struct EntryAbility {
onCreate(want: Want, launchParam: LaunchParam) {
// 判断应用是否被系统分享拉起
if (launchParam.launchReason === LaunchReason.SHARE) {
console.log('应用被系统分享拉起');
// 处理分享数据
this.handleShareData(want);
} else {
console.log('应用正常启动');
// 正常启动的处理
this.handleNormalStartup();
}
}
onNewWant(want: Want, launchParam: LaunchParam) {
// 判断应用是否被系统分享拉起
if (launchParam.launchReason === LaunchReason.SHARE) {
console.log('应用被系统分享拉起');
// 处理分享数据
this.handleShareData(want);
} else {
console.log('应用正常启动');
// 正常启动的处理
this.handleNormalStartup();
}
}
handleShareData(want: Want) {
// 解析want参数,获取分享数据
let shareData: systemShare.SharedData = new systemShare.SharedData({
utd: want.parameters['utd'],
uri: want.parameters['uri'],
title: want.parameters['title'],
preview: want.parameters['preview'],
description: want.parameters['description']
});
// 处理分享数据
console.log(`分享数据:${shareData}`);
}
handleNormalStartup() {
// 正常启动的处理
console.log('正常启动');
}
}
在实际项目中怎么用?
上面的代码是基础实现,但在实际项目中,你可能会这样用:
示例:根据启动方式显示不同页面
import { common } from '@kit.AbilityKit';
import { systemShare } from '@kit.ShareKit';
import { router } from '@kit.ArkUI';
@Entry
@Component
struct EntryAbility {
onCreate(want: Want, launchParam: LaunchParam) {
// 判断应用是否被系统分享拉起
if (launchParam.launchReason === LaunchReason.SHARE) {
console.log('应用被系统分享拉起');
// 跳转到分享内容页面
router.pushUrl({
url: 'pages/ShareContentPage',
params: {
utd: want.parameters['utd'],
uri: want.parameters['uri'],
title: want.parameters['title'],
preview: want.parameters['preview'],
description: want.parameters['description']
}
});
} else {
console.log('应用正常启动');
// 跳转到首页
router.pushUrl({
url: 'pages/IndexPage'
});
}
}
onNewWant(want: Want, launchParam: LaunchParam) {
// 判断应用是否被系统分享拉起
if (launchParam.launchReason === LaunchReason.SHARE) {
console.log('应用被系统分享拉起');
// 跳转到分享内容页面
router.replaceUrl({
url: 'pages/ShareContentPage',
params: {
utd: want.parameters['utd'],
uri: want.parameters['uri'],
title: want.parameters['title'],
preview: want.parameters['preview'],
description: want.parameters['description']
}
});
} else {
console.log('应用正常启动');
// 跳转到首页
router.replaceUrl({
url: 'pages/IndexPage'
});
}
}
}
🥦 西兰花小贴士:onCreate 中使用 router.pushUrl,onNewWant 中使用 router.replaceUrl。这是因为 onCreate 是应用首次启动,onNewWant 是应用已经在运行时被唤起。
示例:记录启动方式
import { common } from '@kit.AbilityKit';
import { systemShare } from '@kit.ShareKit';
@Entry
@Component
struct EntryAbility {
onCreate(want: Want, launchParam: LaunchParam) {
// 记录启动方式
let launchReason = launchParam.launchReason === LaunchReason.SHARE ? '分享拉起' : '正常启动';
console.log(`应用启动方式:${launchReason}`);
// 这里可以调用你的统计 SDK,记录启动方式
// 比如:Analytics.track('app_launch', { reason: launchReason });
// 判断应用是否被系统分享拉起
if (launchParam.launchReason === LaunchReason.SHARE) {
// 处理分享数据
this.handleShareData(want);
} else {
// 正常启动的处理
this.handleNormalStartup();
}
}
onNewWant(want: Want, launchParam: LaunchParam) {
// 记录启动方式
let launchReason = launchParam.launchReason === LaunchReason.SHARE ? '分享拉起' : '正常启动';
console.log(`应用启动方式:${launchReason}`);
// 这里可以调用你的统计 SDK,记录启动方式
// 比如:Analytics.track('app_launch', { reason: launchReason });
// 判断应用是否被系统分享拉起
if (launchParam.launchReason === LaunchReason.SHARE) {
// 处理分享数据
this.handleShareData(want);
} else {
// 正常启动的处理
this.handleNormalStartup();
}
}
handleShareData(want: Want) {
// 解析want参数,获取分享数据
let shareData: systemShare.SharedData = new systemShare.SharedData({
utd: want.parameters['utd'],
uri: want.parameters['uri'],
title: want.parameters['title'],
preview: want.parameters['preview'],
description: want.parameters['description']
});
// 处理分享数据
console.log(`分享数据:${shareData}`);
}
handleNormalStartup() {
// 正常启动的处理
console.log('正常启动');
}
}
常见问题
Q1:launchReason 一直是 STARTUP 怎么办?
检查以下几点:
-
是否正确配置了 module.json5:
- 确认
skills中的actions是否设置为ohos.want.action.sendData - 确认
uris中的type是否和分享数据的 utd 类型匹配
- 确认
-
是否正确解析了 launchParam:
- 确认是否在
onCreate或onNewWant中解析了launchParam - 确认
launchParam.launchReason是否正确访问
- 确认是否在
Q2:onCreate 和 onNewWant 有什么区别?
| 方法 | 调用时机 | 适用场景 |
|---|---|---|
| onCreate | 应用首次启动时 | 处理首次分享 |
| onNewWant | 应用在后台时被唤起 | 处理后续分享 |
Q3:如何区分不同的分享拉起?
可以通过 want.parameters 中的参数来区分不同的分享拉起:
if (launchParam.launchReason === LaunchReason.SHARE) {
let utd = want.parameters['utd'];
if (utd === 'general.text') {
console.log('文本分享拉起');
} else if (utd === 'general.image') {
console.log('图片分享拉起');
} else if (utd === 'general.video') {
console.log('视频分享拉起');
} else if (utd === 'general.link') {
console.log('链接分享拉起');
}
}
下一步学什么?
看完这篇,你应该已经能判断应用是否被系统分享拉起了。接下来可以深入学习:
- 配置目标应用名单:企业应用专属功能
- 手机间碰一碰分享:碰一碰分享的实现
- 手机与PC/2in1设备间分享:跨设备分享的实现
- 常见问题:分享失败、数据类型不支持等问题的解决方案
推荐资料
📚 官方文档:
我是盐焗西兰花,
不教理论,只给你能跑的代码和避坑指南。
下期见!🥦
更多推荐




所有评论(0)