鸿蒙Next元服务开发详解

news/2024/11/30 15:12:39/文章来源:https://www.cnblogs.com/youlanjihua/p/18578455

之前写过关于元服务的文章,大家对元服务应该也有一定的了解,它是一种更加高效便捷的应用形式,免安装,有独立的入口,说的简单一点就像是把微信小程序放到系统层面,相比微信小程序更加快捷,因为连微信也不用打开了。

今天就分享一下怎么开发一个鸿蒙元服务。

 

图片

 

创建项目

元服务的创建和普通应用有所区别,我们要创建的是Atomic Service,模版选择Empty Ability就可以。

 

图片

 

接下来要为元服务注册App ID,元服务和微信小程序类似,必须要有App ID才能进行开发。

 

图片

 

好在这一步比较方便,点注册填一下名称等信息就可以了,再回到工程页面,一个元服务工程就创建好了。看一下工程目录好像和普通应用并没有什么不同。

 

图片

 

配置图标

在entry文件夹右键新建Image Asset,选择一个1024*1024的图片就可以设置为元服务的图标了。

 

图片

 

开发元服务页面

现在进入正式的开发环节,依然打开pages文件夹下的Index文件,这里同样是元服务的内容页面,看一下好像比普通应用多了一些代码,不必理会。

 

图片

 

在元服务中页面的开发、页面之间的跳转和普通应用一样,可以添加一个按钮感受一下:

Column(){  Text(this.message)    .id('HelloWorld')    .fontSize(50)    .fontWeight(FontWeight.Bold)    .alignRules({      center: { anchor: '__container__', align: VerticalAlign.Center },      middle: { anchor: '__container__', align: HorizontalAlign.Center }    })  Button('按钮')    .fontColor(Color.White)    .fontSize(15)    .width(100)    .margin({top:40})    .onClick(()=>{    })}.justifyContent(FlexAlign.Center).alignItems(HorizontalAlign.Center).height('100%').width('100%')

 

图片

 

都差不多,不再赘述,我们重点说一下和普通应用开发不一样的地方,比如网络请求。

在元服务中,网络请求除了需要配置网络权限外,还要在应用中心配置域名白名单,这一点又和微信小程序类似。

 

图片

 

打开应用中心的开发管理就可以配置域名,不过这种方式是有延迟和缓存的,在开发阶段可以在手机的开发者选项中开发元服务豁免开关,取消对域名的访问限制,然后就可以进行网络请求了。我找了一个天气的接口:

let url = 'https://.com/api/weather?city=%E6%9E%A3%E5%BA%84%E6%BB%95%E5%B7%9E'
let result: ResultData = await HttpManager.getInstance().request({  method: RequestMethod.GET,  url: url
})
let resultData: WeatherItem[] = result.data.data

开发卡片页面

卡片是元服务的一种快捷操作和入口,现在我们尝试常见一个卡片,在entey文件夹右键新建Dynamic Widget,创建完成之后可以发现工程目录中除了新建的卡片,还新增了entryformability文件夹,这是卡片的生命周期函数。

 

图片

 

现在我们尝试在卡片中开发一些简单的页面,比如一个天气页面:

Row() {  Column() {    Column(){      Text(this.city)        .fontSize(14)        .fontColor(Color.White)      Text(this.wendu )        .fontWeight(FontWeight.Bold)        .fontSize(20)        .fontColor(Color.White)        .margin({top:5})    }    Text(this.tianqi + '  空气' + this.pm)      .fontColor(Color.White)      .fontSize(13)  }  .justifyContent(FlexAlign.SpaceBetween)  .width(this.FULL_WIDTH_PERCENT)  .alignItems(HorizontalAlign.Start)  .height(this.FULL_HEIGHT_PERCENT)  Image($r('app.media.clear'))    .width(25)    .height(25)    .objectFit(ImageFit.Contain)      .onClick(() => {        postCardAction(this, {          action: 'message',          params: { msgTest: 'messageEvent' }        });      })}.alignItems(VerticalAlign.Top).padding({left:15,right:40,top:15,bottom:15}).linearGradient({  direction: GradientDirection.Bottom, // 渐变方向  repeating: false, // 渐变颜色是否重复  colors: [[0x9FCCE0, 0.0], [0xC9E4DD, 1.0]]}).width(this.FULL_WIDTH_PERCENT).height(this.FULL_HEIGHT_PERCENT).onClick(() => {  postCardAction(this, {    action: this.ACTION_TYPE,    abilityName: this.ABILITY_NAME,    params: {      message: this.MESSAGE    }  });})

 

图片

 

两个手指捏合屏幕,在列表里选择程序就可以把卡片添加到桌面。

数据传递

大家是否还记得刚才我在元服务中进行了一个网络请求,刚好也是一个天气数据接口,现在我们要做的是如何将元服务中的数据传递到卡片中进行展示。

需要告诉大家的是,元服务和卡片是两套进程,并不能直接进行通信。所以我们这里使用用户首选项,先在元服务中将数据保存,再从卡片中取出数据.

首先在主应用中保存数据:

let pf = await preferences.getPreferences(context, "CardData")
await pf.put('city', result.data.city)
await pf.put('tianqi', weatherItem.weather)
await pf.put('pm', weatherItem.air_quality)
await pf.put('wendu', weatherItem.temperature)pf.flush()

下面尝试在卡片里取出数据,这里涉及到卡片的刷新,卡片的刷讯分为主动刷新和定时刷新,今天今天先主要分享一个主动刷新。也就是通过用户的主动操作进行刷新,比如点击一个按钮,我给天气图片添加一个点击事件:

.onClick(() => {  postCardAction(this, {    action: 'message',    params: { msgTest: 'messageEvent' }  });
})

这时候点击图片会调用entryformability文件中的onFormEvent方法,我们在这里取出数据并更新页面:

onFormEvent(formId: string, message: string) {  // Called when a specified message event defined by the form provider is triggered.  this.updateUI(formId)
}
async updateUI(formId:string){  let pf = await preferences.getPreferences(this.context,'CardData')  let cityStr = await pf.get('city', '0')  let tianqi = await pf.get('tianqi', '0')  let pm = await pf.get('pm', '0')  let wendu = await pf.get('wendu', '0')  class FormDataClass {    city = cityStr   tianqi = tianqi    pm =  pm    wendu = wendu  }  let formData = new FormDataClass();  let formInfo: formBindingData.FormBindingData = formBindingData.createFormBindingData(formData);  formProvider.updateForm(formId, formInfo).then(() => {  }).catch((error: BusinessError) => {  })
}

以上就是开发一个元服务的简单介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/844148.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅谈鸿蒙跨平台开发框架ArkUI-X

之前写过使用uniapp的跨平台开发鸿蒙项目,今天分享一下开发体验更友好的跨平台开发框架ArkUI-X。 ArkUI-X看起来像是鸿蒙官方的框架,在DevEco中就可以安装和使用,而且会ArkUI就可以开发安卓和、iOS和鸿蒙三个平台的app,下面简单介绍一下它的用法。 打开DevEco的Preference菜…

20222425 2024-2025-1 《网络与系统攻防技术》实验五实验报告

1.实验内容 Metasploit Framework(MSF)是一款开源安全漏洞检测工具,附带数千个已知的软件漏洞,并保持持续更新。Metasploit可以用来信息收集、漏洞探测、漏洞利用等渗透测试的全流程,被安全社区冠以“可以黑掉整个宇宙”之名。刚开始的Metasploit是采用Perl语言编写的,但是…

String类的特点

1.String类的特点1.java程序中,只要是双引号字符串,就都是String类的对象 如图只有String这一个类有这种特殊的创建对象方法 我们知道,只有对象才可以通过 点什么来调用方法,而图中s.toString等方法都可以调用,所以s就是String的对象 . 2.字符串在创建之后,内容不可更改 …

Mac OS 15苹方字体不可用,怎么办?

缘由今天使用 mac word 写文档发现选 苹方字体 后变成乱码了...解决办法①打开 Spotlight 搜索:字体册①在 字体册 搜索:苹方,并点击下载对应的字体下载完变成黑色(可用)了:打开系统设置:首先,打开您的macOS系统设置。调整语言顺序:在系统设置中搜索“语言”,然后将“E…

redis基本操作JG

为什么学习redis,前几天有个需求,用到了redis库,之前学习过但仅限于大学的时候,这个时候差不多忘光了,需求测的时候也是现学的几个查询指令。印象最深的是开发设计的时候存储了10个不同key值但value(list字符串)相同的数据,当时问过为什么要存十个,解释为 “为了防止…

探索 TypeScript 编程的利器:ts-morph 入门与实践H6

我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。本文作者:贝儿背景 在开发 web IDE 中生成代码大纲的功能时, 发现自己对 TypeScript 的了解知之甚少,以至于针对该功能的实现没有明确的思…

IDEA本地运行Spark程序报错:HADOOP_HOME and hadoop.home.dir are unset. 解决方法

报错信息 java.lang.RuntimeException: java.io.FileNotFoundException: java.io.FileNotFoundException: HADOOP_HOME and hadoop.home.dir are unset. -see https://wiki.apache.org/hadoop/WindowsProblemsat org.apache.hadoop.util.Shell.getWinUtilsPath(Shell.java:737)…

纯js轻量级图片放大显示插件

在线演示 下载 lightense-images是一款可以将缩略图片在屏幕中间放大显示的纯JS插件。该图片放大插件的效果类似于Medium.com上的图片放大预览效果。它的特点有:轻量级,压缩后的版本仅2KB。 点击缩略图后,以lightbox的方式来显示放大图片。 可以自定义背景遮罩层的颜色和透…

Air780E低功耗模组的LuatOS开发:位运算(bit)示例教程!

本文讲述的是低功耗4G模组Air780E的LuatOS开发,关于位运算(bit)的示例教程,希望大家有所收获。本文讲述的是低功耗4G模组Air780E的LuatOS开发,关于位运算(bit)的示例教程,希望大家有所收获。 一、位运算概述 位运算是一种在计算机系统中对二进制数位进行操作的运算。由于…

【安全运营】当监管要一份网络安全总结报告

经常遇到上级要一份网络安全总结报告的情形,以下举例的格式是比较常见的一种,供大家参考。 网络安全检查总结报告例子 一、报告名称 XXX限公司2024年网络安全检查总结报告。 二、检查总结报告组成 (一)网络安全检查工作组织开展情况(根据公司的管理文件) 我司高度重视网络…

USB无法识别设备?USB驱动问题解析篇

今天我们来讲解的是USB驱动问题,连接USB无法识别模组设备,是不是驱动问题?今天就一起来聊聊如何排查解决。今天我们来讲解的是USB驱动问题,连接USB无法识别模组设备,是不是驱动问题?今天就一起来聊聊如何排查解决。 注意:本文涉及的内容都是基于Windows系统,且不低于Wi…