当前位置: 首页 > news >正文

鸿蒙一次开发,多端部署(十三)功能开发的一多能力介绍

应用开发至少包含两部分工作: UI页面开发和底层功能开发(部分需要联网的应用还会涉及服务端开发)。前面章节介绍了如何解决页面适配的问题,本章节主要介绍应用如何解决设备系统能力差异的兼容问题。

系统能力

系统能力(即SystemCapability,缩写为SysCap)指操作系统中每一个相对独立的特性,如蓝牙,WIFI,NFC,摄像头等,都是系统能力之一。每个系统能力对应多个API,随着目标设备是否支持该系统能力共同存在或消失。

与系统能力相关的,有支持能力集、联想能力集和要求能力集三个核心概念。

  • 支持能力集:设备具备的系统能力集合,在设备配置文件中配置。
  • 要求能力集:应用需要的系统能力集合,在应用配置文件中配置。
  • 联想能力集:开发应用时IDE可联想的API所在的系统能力集合,在应用配置文件中配置。

说明:

  • 只有当应用要求能力集是设备支持能力集的子集的时候,应用才可以在该设备上分发、安装和运行。
  • 可以访问 系统能力列表 了解全量的系统能力。
  • 支持的设备类型分为两大类: 典型设备和厂商自定义设备。默认设备、平板等常用的设备类型属于典型设备,其它的属于厂商自定义设备。对于典型设备,系统已经预定义了相应的系统能力集合;对于厂商自定义设备,需要厂商给出其系统能力集合的定义。

开发指导

设备要求能力集的获取及导入

对于厂商自定义设备,需要开发者自行从厂商处获取该设备的要求能力集并导入到IDE中。

在IDE中点击File->New->Import…后选择“Import Product Compatibility ID”即可选择及导入设备要求能力集,导入后的设备要求能力集会被写入工程的syscap.json文件中。

多设备应用开发

开发多设备应用时,工程中默认的要求能力集是多个设备支持能力集的交集,默认的联想能力集是多个设备支持能力集的并集。

  • 开发者可以在运行时动态判断某设备是否支持特定的系统能力。

  • 开发者可以自行修改联想能力集和要求能力集。

动态逻辑判断

如果某个系统能力没有写入应用的要求能力集中,那么在使用前需要判断设备是否支持该系统能力。

  • 方法1:canIUse接口帮助开发者来判断该设备是否支持某个特定的syscap。
if (canIUse("SystemCapability.Communication.NFC.Core")) {console.log("该设备支持SystemCapability.Communication.NFC.Core");
} else {console.log("该设备不支持SystemCapability.Communication.NFC.Core");
}
  • 方法2:开发者可通过import的方式将模块导入,若当前设备不支持该模块,import的结果为undefined,开发者在使用其API时,需要判断其是否存在。
import controller from '@ohos.nfc.controller';
try {controller.enableNfc();console.log("controller enableNfc success");
} catch (busiError) {console.log("controller enableNfc busiError: " + busiError);
}

说明:

  • 如果某系统能力是应用运行必须的,则要将其写入到应用的要求能力集中,以确保应用不会分发和安装到不符合要求的设备上。
  • 如果某系统能力不是应用运行必须的,则可以在运行时做动态判断,这样可以最大程度扩大应用的适用范围。

配置联想能力集和要求能力集

IDE会根据创建的工程所支持的设备自动配置联想能力集和要求能力集,同时也支持开发者修改。

// syscap.json
{"devices": {"general": [            // 每一个典型设备对应一个syscap支持能力集,可配置多个典型设备"default","tablet"],"custom": [             // 厂家自定义设备{"某自定义设备": ["SystemCapability.Communication.SoftBus.Core"]}]},"development": {             // addedSysCaps内的sycap集合与devices中配置的各设备支持的syscap集合的并集共同构成联想能力集"addedSysCaps": ["SystemCapability.Communication.NFC.Core"]},"production": {              // 用于生成rpcid,慎重添加,可能导致应用无法分发到目标设备上"addedSysCaps": [],      // devices中配置的各设备支持的syscap集合的交集,添加addedSysCaps集合再除去removedSysCaps集合,共同构成要求能力集"removedSysCaps": []     // 当该要求能力集为某设备的子集时,应用才可被分发到该设备上}
}

说明:

  • 对于要求能力集,开发者修改时要十分慎重,修改不当会导致应用无法分发和安装到目标设备上。
  • 对于联想能力集,通过增加系统能力可以扩大IDE可联想的API范围。但要注意这些API可能在某些设备上不支持,使用前需要判断。

总结

从应用开发到用户使用,通常要经历应用分发和下载、应用安装、应用运行等环节。借助SysCap机制,可以在各个环节中加以拦截或管控,保证应用可以在设备上正常安装和使用。

  • 应用分发和下载:只有当应用要求能力集是设备支持能力集的子集时(即设备满足应用运行要求),应用才可以分发到该设备。
  • 应用安装:只有当应用要求能力集是设备支持能力集的子集时,应用才可以安装到该设备。
  • 应用运行:应用在使用要求能力集之外的能力前,需要动态判断相应系统能力的有效性,防止崩溃或功能异常等问题。

SysCap机制可以帮助开发者仅关注设备的系统能力,而不用考虑成百上千种具体的设备类型,降低多设备应用开发难度。

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

相关文章:

  • 说说webpack中常见的Loader?解决了什么问题?
  • 锂电池寿命预测 | Matlab基于ALO-SVR蚁狮优化支持向量回归的锂离子电池剩余寿命预测
  • 腾讯春招后端一面(八股篇)
  • 路由器里如何设置端口映射?
  • Java练手游戏--俄罗斯方块
  • GEE高阶案例——Landsat/Sentinel/MODIS影像进行缨帽变换一行代码实现
  • 【小程序开发】位置 API 集合(二)
  • M4A与MP3:两种音频格式的比较
  • IP地址、子网掩码、网关
  • Unbuntu20.04 git push和pull相关问题
  • 探索软件工程:构建可靠、高效的数字世界
  • Web 常见的攻击方式有哪些?
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • sqlalchemy和moke生成实体类(一)
  • C语言——编程世界的璀璨明珠
  • [译]Python中的类属性与实例属性的区别
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • docker容器内的网络抓包
  • ECS应用管理最佳实践
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • JS数组方法汇总
  • leetcode388. Longest Absolute File Path
  • Mysql优化
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Vue 重置组件到初始状态
  • Vue官网教程学习过程中值得记录的一些事情
  • 构建工具 - 收藏集 - 掘金
  • 区块链将重新定义世界
  • 如何合理的规划jvm性能调优
  • 听说你叫Java(二)–Servlet请求
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (4)STL算法之比较
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (剑指Offer)面试题34:丑数
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)shell调试方法
  • (转载)hibernate缓存
  • .libPaths()设置包加载目录
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .net 中viewstate的原理和使用
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .Net各种迷惑命名解释
  • .net连接MySQL的方法
  • .NET项目中存在多个web.config文件时的加载顺序
  • .pyc文件是什么?
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • :中兴通讯为何成功
  • []使用 Tortoise SVN 创建 Externals 外部引用目录
  • [100天算法】-二叉树剪枝(day 48)
  • [20190416]完善shared latch测试脚本2.txt
  • [ai笔记9] openAI Sora技术文档引用文献汇总
  • [DevOps云实践] 彻底删除AWS云资源
  • [docker] Docker的私有仓库部署——Harbor