鸿蒙学习实战之路-Share Kit系列(10/17)-目标应用接收分享(应用内处理)

鸿蒙学习实战之路-Share Kit系列(10/17)-目标应用接收分享(应用内处理)

最近好多朋友问我:"西兰花啊,我想让我的应用能接收其他应用分享的内容,但不知道代码怎么写?" 害,这问题可问对人了!

今天这篇,我就手把手带你实现目标应用接收分享功能(应用内处理),从零到一,全程不超过 10 分钟(不含调试时间)~


目标应用是啥?

目标应用就是分享内容的接收者。简单说,就是用户从其他应用分享内容到你的应用,你的应用作为目标应用,接收并处理分享的内容。

这就像前端的分享接收功能,只不过 Share Kit 是系统级别的服务,体验更统一。


应用内处理 vs 分享详情页

目标应用接收分享有两种方式:

方式 说明 适用场景
应用内处理 直接在应用内处理分享内容 内容简单,不需要额外操作
分享详情页 弹出一个详情页,用户确认后再处理 内容复杂,需要用户确认

今天我们讲应用内处理,分享详情页会在下一篇文章中讲解。


完整实现步骤

实现目标应用接收分享(应用内处理),就三步:

  1. 配置 module.json5:声明支持的 UTD 类型
  2. 实现 UIAbility:在 onCreate 或 onNewWant 中解析分享数据
  3. 处理分享数据:根据分享数据类型做相应的处理

步骤 1:配置 module.json5

module.json5 中声明支持的 UTD 类型,这样系统才能识别你的应用支持分享。

json 复制代码
{
  "module": {
    "abilities": [
      {
        "name": "EntryAbility",
        "srcEntry": "./ets/entryability/EntryAbility.ets",
        "startWindowIcon": "$media:launcher",
        "startWindowBackground": "$color:start_window_background",
        "exported": true,
        "skills": [
          {
            "entities": [
              "entity.system.home"
            ],
            "actions": [
              "ohos.want.action.sendData"
            ],
            "uris": [
              {
                "scheme": "file",
                "linkFeature": "FileOpen",
                "type": "org.openxmlformats.wordprocessingml.document",
                "maxFileSupported": 1
              }
            ],
            "domainVerify": true
          }
        ]
      }
    ]
  }
}

参数说明

  • actions:设置为 ohos.want.action.sendData,表示接收分享数据
  • uris:声明支持的 UTD 类型,比如 org.openxmlformats.wordprocessingml.document 表示 Word 文档
  • maxFileSupported:最大支持的文件数量,1 表示只支持单个文件

🥦 西兰花警告

我有个朋友第一次配置 module.json5,忘记设置 exported: true,结果其他应用分享不到他的应用,debug 了两小时才发现是配置问题!血泪教训啊朋友们!


步骤 2:实现 UIAbility

在 UIAbility 的 onCreateonNewWant 方法中解析 want 参数,获取分享数据。

typescript 复制代码
import { common } from '@kit.AbilityKit';
import { systemShare } from '@kit.ShareKit';

@Entry
@Component
struct EntryAbility {
  onCreate(want: Want, launchParam: LaunchParam) {
    // 解析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']
    });
    // 处理分享数据
    this.handleShareData(shareData);
  }

  onNewWant(want: Want, launchParam: LaunchParam) {
    // 解析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']
    });
    // 处理分享数据
    this.handleShareData(shareData);
  }

  handleShareData(shareData: systemShare.SharedData) {
    // 处理分享数据
    console.log(`分享数据:${shareData}`);
  }
}

方法说明

  • onCreate:应用首次启动时调用,用于处理首次分享
  • onNewWant:应用在后台时被唤起时调用,用于处理后续分享
  • handleShareData:自定义方法,用于处理分享数据

🥦 西兰花小贴士
onCreateonNewWant 都需要实现,因为分享可能发生在应用首次启动时,也可能发生在应用已经运行时。


步骤 3:处理分享数据

根据分享数据类型做相应的处理。

typescript 复制代码
handleShareData(shareData: systemShare.SharedData) {
  // 根据utd类型处理不同的分享数据
  switch (shareData.utd) {
    case 'general.text':
      this.handleTextShare(shareData);
      break;
    case 'general.image':
      this.handleImageShare(shareData);
      break;
    case 'general.video':
      this.handleVideoShare(shareData);
      break;
    case 'general.link':
      this.handleLinkShare(shareData);
      break;
    default:
      console.log('不支持的分享类型');
      break;
  }
}

handleTextShare(shareData: systemShare.SharedData) {
  console.log(`处理文本分享:${shareData.description}`);
}

handleImageShare(shareData: systemShare.SharedData) {
  console.log(`处理图片分享:${shareData.uri}`);
}

handleVideoShare(shareData: systemShare.SharedData) {
  console.log(`处理视频分享:${shareData.uri}`);
}

handleLinkShare(shareData: systemShare.SharedData) {
  console.log(`处理链接分享:${shareData.uri}`);
}

完整代码示例

把上面的步骤整合起来,就是一个完整的目标应用接收分享(应用内处理)的实现:

typescript 复制代码
import { common } from '@kit.AbilityKit';
import { systemShare } from '@kit.ShareKit';

@Entry
@Component
struct EntryAbility {
  onCreate(want: Want, launchParam: LaunchParam) {
    // 解析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']
    });
    // 处理分享数据
    this.handleShareData(shareData);
  }

  onNewWant(want: Want, launchParam: LaunchParam) {
    // 解析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']
    });
    // 处理分享数据
    this.handleShareData(shareData);
  }

  handleShareData(shareData: systemShare.SharedData) {
    // 根据utd类型处理不同的分享数据
    switch (shareData.utd) {
      case 'general.text':
        this.handleTextShare(shareData);
        break;
      case 'general.image':
        this.handleImageShare(shareData);
        break;
      case 'general.video':
        this.handleVideoShare(shareData);
        break;
      case 'general.link':
        this.handleLinkShare(shareData);
        break;
      default:
        console.log('不支持的分享类型');
        break;
    }
  }

  handleTextShare(shareData: systemShare.SharedData) {
    console.log(`处理文本分享:${shareData.description}`);
  }

  handleImageShare(shareData: systemShare.SharedData) {
    console.log(`处理图片分享:${shareData.uri}`);
  }

  handleVideoShare(shareData: systemShare.SharedData) {
    console.log(`处理视频分享:${shareData.uri}`);
  }

  handleLinkShare(shareData: systemShare.SharedData) {
    console.log(`处理链接分享:${shareData.uri}`);
  }
}

在实际项目中怎么用?

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

示例:接收文本分享并显示

typescript 复制代码
import { common } from '@kit.AbilityKit';
import { systemShare } from '@kit.ShareKit';
import { router } from '@kit.ArkUI';

@Entry
@Component
struct EntryAbility {
  // 分享的文本内容
  sharedText: string = '';

  onCreate(want: Want, launchParam: LaunchParam) {
    // 解析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']
    });

    // 处理分享数据
    this.handleShareData(shareData);
  }

  onNewWant(want: Want, launchParam: LaunchParam) {
    // 解析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']
    });

    // 处理分享数据
    this.handleShareData(shareData);
  }

  handleShareData(shareData: systemShare.SharedData) {
    // 根据utd类型处理不同的分享数据
    if (shareData.utd === 'general.text') {
      this.sharedText = shareData.description || '';
    }
  }

  build() {
    Column() {
      Text('接收分享示例')
        .fontSize(20)
        .fontWeight(FontWeight.Bold)
        .margin(20)
        .fontColor(Color.Black);

      if (this.sharedText) {
        Text('分享的文本:')
          .fontSize(16)
          .margin(20)
          .fontColor(Color.Black);

        Text(this.sharedText)
          .fontSize(16)
          .margin({ left: 20, right: 20, bottom: 20 })
          .fontColor(Color.Gray);
      } else {
        Text('暂无分享内容')
          .fontSize(16)
          .margin(20)
          .fontColor(Color.Gray);
      }
    }
    .width('100%')
    .height('100%');
  }
}

常见问题

Q1:其他应用分享不到我的应用怎么办?

检查以下几点:

  1. module.json5 配置是否正确

    • 确认 exported 是否设置为 true
    • 确认 actions 是否设置为 ohos.want.action.sendData
    • 确认 uris 中的 type 是否和分享数据的 utd 类型匹配
  2. 应用是否已安装

    • 确认目标应用是否已安装
    • 确认应用版本是否支持分享

Q2:如何支持多种分享类型?

uris 中配置多个 type,支持多种分享类型:

json 复制代码
"uris": [
  {
    "scheme": "file",
    "linkFeature": "FileOpen",
    "type": "general.text",
    "maxFileSupported": 1
  },
  {
    "scheme": "file",
    "linkFeature": "FileOpen",
    "type": "general.image",
    "maxFileSupported": 1
  }
]

Q3:onCreate 和 onNewWant 有什么区别?

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

下一步学什么?

看完这篇,你应该已经能实现目标应用接收分享(应用内处理)了。接下来可以深入学习:

  1. 分享详情页处理分享内容:ShareExtensionAbility 的配置和实现
  2. 判断应用是否被系统分享拉起:LaunchParam 的使用
  3. 配置目标应用名单:企业应用专属功能
  4. 高级功能:碰一碰分享、隔空传送

推荐资料

📚 官方文档


我是盐焗西兰花,

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

下期见!🥦

相关推荐
大龄程序员狗哥3 小时前
第25篇:Q-Learning算法解析——强化学习中的经典“价值”学习(原理解析)
人工智能·学习·算法
南境十里·墨染春水3 小时前
linux学习进展 线程同步——互斥锁
java·linux·学习
nashane4 小时前
HarmonyOS 6学习:旋转动画优化与长截图性能调优——打造丝滑交互体验的深度实践
学习·交互·harmonyos·harmonyos 5
华清远见IT开放实验室4 小时前
智能手表完整项目实现,比赛求职双向加分,基于嵌入式大赛推荐开发板(STM32U5)
stm32·单片机·嵌入式硬件·学习·智能手表·嵌入式大赛
炽烈小老头5 小时前
【 每天学习一点算法 2026/04/22】四数相加 II
学习·算法
uncle_ll5 小时前
LangChain基础学习笔记
笔记·学习·langchain·llm·rag
三品吉他手会点灯5 小时前
C语言学习笔记 - 14.C编程预备计算机专业知识 - 本讲内容概述
c语言·笔记·学习
Thanwind5 小时前
从0开始的机器学习之旅(二):监督学习,从线性回归说起
学习·机器学习·线性回归
2501_942326445 小时前
易速乐考,轻松备考
学习·教育电商
菜鸟‍5 小时前
【CVPR 2026】LitePT:更轻、更强的点云 Transformer【论文学习】
深度学习·学习·transformer