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

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

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


判断拉起方式是啥?

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

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

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


LaunchParam 是啥?

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

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

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


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

在 UIAbility 的 onCreateonNewWant 方法中解析 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.pushUrlonNewWant 中使用 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 怎么办?

检查以下几点:

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

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

    • 确认是否在 onCreateonNewWant 中解析了 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('链接分享拉起');
  }
}

下一步学什么?

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

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

推荐资料

📚 官方文档


我是盐焗西兰花,
不教理论,只给你能跑的代码和避坑指南。
下期见!🥦

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐