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

创建项目
元服务的创建和普通应用有所区别,我们要创建的是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) => {  })
}
以上就是开发一个元服务的简单介绍
鸿蒙Next元服务开发详解的更多相关文章
- wpf 客户端【JDAgent桌面助手】开发详解(三) 瀑布流效果实现与UI虚拟化优化大数据显示
		
目录区域: 业余开发的wpf 客户端终于完工了..晒晒截图 wpf 客户端[JDAgent桌面助手]开发详解-开篇 wpf 客户端[JDAgent桌面助手]详解(一)主窗口 圆形菜单... wpf 客 ...
 - iOS原生地图开发详解
		
在上一篇博客中:http://my.oschina.net/u/2340880/blog/414760.对iOS中的定位服务进行了详细的介绍与参数说明,在开发中,地位服务往往与地图框架结合使用,这篇博 ...
 - 产品经理-需求分析-用户故事-敏捷开发 详解 一张图帮你了解Scrum敏捷流程
		
产品经理-需求分析-用户故事-敏捷开发 详解 用户故事是从用户的角度来描述用户渴望得到的功能.一个好的用户故事包括三个要素:1. 角色:谁要使用这个功能.2. 活动:需要完成什么样的功能.3. 商业价 ...
 - EasyPR--开发详解(6)SVM开发详解
		
在前面的几篇文章中,我们介绍了EasyPR中车牌定位模块的相关内容.本文开始分析车牌定位模块后续步骤的车牌判断模块.车牌判断模块是EasyPR中的基于机器学习模型的一个模块,这个模型就是作者前文中从机 ...
 - 基于H5的微信支付开发详解
		
这次总结一下用户在微信内打开网页时,可以调用微信支付完成下单功能的模块开发,也就是在微信内的H5页面通过jsApi接口实现支付功能.当然了,微信官网上的微信支付开发文档也讲解的很详细,并且有实现代码可 ...
 - ****基于H5的微信支付开发详解[转]
		
这次总结一下用户在微信内打开网页时,可以调用微信支付完成下单功能的模块开发,也就是在微信内的H5页面通过jsApi接口实现支付功能.当然了,微信官网上的微信支付开发文档也讲解的很详细,并且有实现代码可 ...
 - 【转发】NPAPI开发详解,Windows版
		
NPAPI开发详解,Windows版 9 jiaofeng601, +479 9人支持,来自Meteor.猪爪.hanyuxinting更多 .是非黑白 .Yuan Xulei.hyolin.Andy ...
 - 热烈祝贺华清远见《ARM处理器开发详解》第2版正式出版
		
2014年6月,由华清远见研发中心组织多名业 内顶尖讲师编写的<ARM处理器开发详解>一书正式出版.本书以S5PV210处理器为平台,详细介绍了嵌入式系统开发的各个主要环节,并注重实践,辅 ...
 - 嵌入式Linux应用程序开发详解------(创建守护进程)
		
嵌入式Linux应用程序开发详解 华清远见 本文只是阅读文摘. 创建一个守护进程的步骤: 1.创建一个子进程,然后退出父进程: 2.在子进程中使用创建新会话---setsid(): 3.改变当前工作目 ...
 - wpf 客户端【JDAgent桌面助手】开发详解(四) popup控件的win8.0的bug
		
目录区域: 业余开发的wpf 客户端终于完工了..晒晒截图 wpf 客户端[JDAgent桌面助手]开发详解-开篇 wpf 客户端[JDAgent桌面助手]详解(一)主窗口 圆形菜单... wpf 客 ...
 
随机推荐
- [ABC259F] Select Edges 题解
			
很容易想到树形 dp. 考虑在有根树内,每个点都有两种状态: 不选自己和父亲的边: 要选自己和父亲的边. 那么单独对于子树内部而言,就要分两种情况: 最多可以向 \(d_i\) 个孩子连边,对应上述第 ...
 - 泰山派设备控制(RGB)
			
泰山派设备系统控制(RGB) 1.进入设备系统 cd /sys/class 2.进入RGB灯子系统 cd /sys/class/leds/ 罗列可操作的设备,可以看到三个设备,"rgb-le ...
 - 批处理脚本(.bat)实现实时监测文件夹并执行命令 [假设有新文件则拷贝到远程文件夹内]
			
想到一个情景.程序实时监测文件夹情况,如果有新文件进入,分析其文件名,然后如果满足预设条件,则做相应操作.比如扫描仪扫描了文件,会将新文件保存进特定文件夹内,可以使用该程序来做处理. 在Windows ...
 - 使用DeepSeek-R1分析电影票房
			
最近在学习DeepSeek-R1本地化部署的相关知识,看到了1个比较有意思的视频. 在该视频中,其主要逻辑就是当用户上传1个Excel后,之后就可以通过交互式的方式对这个Excel中的数据进行分析.但 ...
 - Java Map一些基本使用方法
			
1 // Map key值不能相同,value值可以相同 2 // HashMap中的Entry对象是无序排列的 3 4 // 实例化1 5 Map<String, String> map ...
 - Supac 如何修改地址界限高层点
			
编辑->图层->运算 2.选择z ->填写高度 如-180阶段 3.保存
 - ascci 码表
 - golang 使用goto进行多错误处理
			
goto 语句介绍 在 Go 语言中,可以通过goto语句跳转到标签,进行代码间的无条件跳转.另外,goto语句在快速跳出循环.避免重复退出方面可以简化代码实现过程,但在结构化程序设计中一般不主张使用 ...
 - Trae 开发工具与使用技巧
			
大家好,我是 V 哥. 前不久,字节重磅推出 AI 原生 IDE Trae,有了这款工具,程序员的开发效率得到了大大的提升,如何你是程序员,还没有使用起来,那 V 哥建议你即刻起马上安装上,谁用谁知道 ...
 - Python实现PDF转换文件格式
			
最近工作中经常遇到收到其他人提供的pdf文档,想要编辑修改下或者复制部分内容比较困难,想通过现有的pdf工具软件转换文档格式,基本都要充钱,为了免费实现pdf转换工具,网上查了下相关技术方案,整理了下 ...