鸿蒙学习实战之路-Share Kit系列(12/17)-判断应用是否被系统分享拉起

鸿蒙学习实战之路-Share Kit系列(12/17)-判断应用是否被系统分享拉起

最近好多朋友问我:"西兰花啊,我想知道我的应用是不是被系统分享拉起的,但不知道代码怎么写?" 害,这问题可问对人了!

今天这篇,我就手把手带你实现判断应用是否被系统分享拉起功能,从零到一,全程不超过 5 分钟(不含调试时间)~


判断拉起方式是啥?

判断应用是否被系统分享拉起,就是区分应用是正常启动 还是被分享拉起。比如:

  • 用户点击应用图标启动:正常启动
  • 用户从其他应用分享内容到你的应用:被分享拉起

区分这两种启动方式,可以帮助你做不同的处理,比如被分享拉起时直接显示分享内容,正常启动时显示首页。


LaunchParam 是啥?

LaunchParam 是应用启动参数,用于描述应用的启动方式。其中 launchReason 字段表示应用启动的原因。

launchReason 说明
LaunchReason.STARTUP 应用正常启动
LaunchReason.SHARE 应用被系统分享拉起

🥦 西兰花小贴士 :
LaunchReason 是一个枚举类型,可以直接使用 LaunchReason.SHARE 来判断应用是否被系统分享拉起。


如何判断应用是否被系统分享拉起?

在 UIAbility 的 onCreate 或 onNewWant 方法中解析 launchParam 参数,判断 launchReason 是否为 LaunchReason.SHARE。

完整代码示例

typescript 复制代码
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('正常启动');
  }
}

在实际项目中怎么用?

上面的代码是基础实现,但在实际项目中,你可能会这样用:

示例:根据启动方式显示不同页面

typescript 复制代码
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 是应用已经在运行时被唤起。


示例:记录启动方式

typescript 复制代码
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 怎么办?

检查以下几点:

  1. 是否正确配置了 module.json5:

    • 确认 skills 中的 actions 是否设置为 ohos.want.action.sendData
    • 确认 uris 中的 type 是否和分享数据的 utd 类型匹配
  2. 是否正确解析了 launchParam:

    • 确认是否在 onCreate 或 onNewWant 中解析了 launchParam
    • 确认 launchParam.launchReason 是否正确访问

Q2:onCreate 和 onNewWant 有什么区别?

方法 调用时机 适用场景
onCreate 应用首次启动时 处理首次分享
onNewWant 应用在后台时被唤起 处理后续分享

Q3:如何区分不同的分享拉起?

可以通过 want.parameters 中的参数来区分不同的分享拉起:

typescript 复制代码
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('链接分享拉起');
  }
}

下一步学什么?

看完这篇,你应该已经能判断应用是否被系统分享拉起了。接下来可以深入学习:

  1. 配置目标应用名单:企业应用专属功能
  2. 手机间碰一碰分享:碰一碰分享的实现
  3. 手机与PC/2in1设备间分享:跨设备分享的实现
  4. 常见问题:分享失败、数据类型不支持等问题的解决方案

推荐资料

📚 官方文档:


我是盐焗西兰花,

不教理论,只给你能跑的代码和避坑指南。

下期见!🥦

相关推荐
小雪崩6 小时前
嵌入式学习 day64:字符设备驱动
学习
个 人 练 习 生6 小时前
C++ string 类模拟实现:从底层理解字符串(上)
开发语言·c++·经验分享·学习·程序人生
guslegend6 小时前
脚手架原理与本地调试:从 bin 软链接到 npm link
前端·npm·node.js·脚手架·前端工程化
坤坤子吖6 小时前
C++智能指针:RAII、shared_ptr与内存泄漏
开发语言·c++·笔记·学习
海码事务所7 小时前
Google Play 新个人开发者账号上架指南:12 人连续 14 天封闭测试怎么做?
前端
田威AI7 小时前
图片内文字翻译的规格:输入输出、保真、自动化、时间与费用
前端·计算机视觉
不可能片场7 小时前
命令行中文变问号 我用环境变量救了场
前端·electron
lerhxx7 小时前
AI 应用中的上下文管理 —— 从"上下文窗口"到"分层压缩"的工程实践
前端·javascript
骑着蜗牛撵大象3277 小时前
多 Agent 分治协作:MapReduce 模式下的并行扇出与结果归并
前端
用户55318297327 小时前
Flutter iOS 热更新深入 Dart VM:读懂函数入口、解释执行与调用桥接
前端