想了解更多开源请访问:HarmonyOS3.0发布后,您可以查看api8的一个关键动作,就是彻底抛弃java,不提供api8以下版本的兼容性。完全是颠覆性的改变,显然不可能兼容低版本。那么在api7之前开发过的朋友就会知道,在之前的js或者ets开发中,有几个关键点是离不开java的,比如我之前博客写的动态权限申请,以后再介绍关键技术是ServiceAbility。之前的ServiceAbility是完全基于Java开发的,可以说和Android中的开发模式是一样的。下面开始尝试ServiceAbility的纯js或者ets开发。在这里吐槽一下没有官方文档吧。我已经反馈了正式的整改文件。文档中的一些小错误和不足,导致我花了十多个小时才把Service的所有核心技能都搞定了。最难的是Service主动向FA推送数据。做过Android的可能都知道Android里面的这个。它是基于java的回调机制实现的,这里官方文档并没有说这个核心技能是如何实现的。js的回调机制和java的回调机制还是有很大区别的。我开始关注回调。花了很长时间,最后尝试了N种方案,终于找到了最优解,得到了这个核心功能。本文将首先介绍Js版本的ServiceAbility开发。场景介绍基于Service模板的Ability(以下简称“Service”)主要用于后台运行任务(如进行音乐播放、文件下载等),不提供用户界面。Service可以被其他应用或能力启动,即使用户切换到其他应用,Service也会继续在后台运行。接口说明表1Service中相关生命周期函数介绍。开发步骤本文只实现了最基本的Service的创建、启动和停止。创建项目首先使用最新版本的DevEcoStudio(992版)开发工具创建项目,选择最新的api8,如下图所示:创建项目时需要注意bundleName和上图描述的package,因为后面在核心api中要用到这两个参数,如果对这两个参数的含义不清楚,可以参考我的另一篇博文《??App与Hap、Entry与feature,bundleName与packge,务必弄明白??》。CreateService项目创建完成后,用鼠标选中js目录,然后点击鼠标右键,如下图,选择为了创建一个Service。服务也是一种能力。Ability为Service提供了以下生命周期方法。开发者可以重写这些方法,在能力请求与服务能力交互时添加其他处理方法。创建Service的代码示例如下:exportdefault{onStart(want){console.info('ServiceAbilityonStart');},onStop(){console.info('ServiceAbilityonStop');},onConnect(想要){控制台。信息('ServiceAbilityonConnect');返回{};},onReconnect(want){console.info('ServiceAbilityonReconnect');},onDisconnect(){console.info('ServiceAbilityonDisconnect');},onCommand(want,restart,startId){console.info('ServiceAbilityonCommand');}};本文将仅说明如何启动和停止服务。写完启动和停止服务的触发代码,再看看生活中会有哪些Periodicfunctions会被回调。由于Service也是一种Ability,Service创建后会自动在应用配置文件config.json中生成相关的核心配置信息。核心配置之一是type为“service”,如下:true...}]...}...}启动服务极其简单在页面上,只放置了两个文本按钮,分别用于触发“启动服务”和“停止服务”,如如下图所示:Ability为开发者提供了startAbility()方法来启动另一个Ability。因为Service也是Ability的一种,所以开发者也可以通过将Want传递给这个方法来启动Service。开发者可以通过构造一个包含bundleName和abilityName的Want对象来设置目标Service信息。参数含义如下:bundleName:表示应用的唯一标识名称,即config.json中的bundleName。abilityName:表示要启动的Ability的名称。这里使用完整的Ability名称,即package+'.'+Ability名称。启动本地设备Service的代码示例如下:首先导入系统库。从“@ohos.ability.featureAbility”导入featureAbility;那么业务逻辑代码如下://启动服务按钮绑定的点击事件onClickStartService(){letpromise=featureAbility.startAbility({want:{bundleName:"com.xdw.jsdemo",abilityName:"com.example.entry.ServiceAbility",},});执行以上代码后,Ability会通过startAbility()方法启动Service。如果Service还没有运行,系统会先调用onStart()初始化Service,然后回调Service的onCommand()方法启动Service。如果Service正在运行,系统会直接回调Service的onCommand()方法启动Service。不支持预览器进行测试。接下来启动模拟器或真机(必须有api"=8)进行测试,多次点击“启动服务”按钮,观察日志输出,日志输出如下图:创建后会一直保留,在后台运行,除非必须回收内存资源,否则系统不会停止或销毁Service,开发者可以通过Service中的featureAbility.terminateSelf()来停止Service,这里需要注意的是官方sdk目前没有在其他Abilities中提供主动停止Service的API,所以现在不可能直接点击UI中的“StopService”按钮直接调用API停止服务,但不代表不能通过点击按钮来停止服务,这个的实现会在下一章讲到,这里只讲通过当前Service中的featureAbility.terminateSelf()来停止Service。由于不是通过UI主动操作,所以什么时候停止服务需要一个触发机会。最简单的方法就是在Service中加一个timer进行demo演示。代码如下:onStart(want){console.info('ServiceAbilityonStart');//5秒后停止服务setTimeout(()=>{console.info('delay5seconds');featureAbility.terminateSelf();},5000)},但是我这里试了一下,试了很多次后发现,我发现Service中目前不支持setTimout定时器的操作。不知道是故意设计成这样还是bug。目前已反馈给华为跟进。那我只能用最底层的方式来演示了,代码如下:onCommand(want,restart,startId){console.info('ServiceAbilityonCommand');featureAbility.terminateSelf();}最终运行日志截图如下:总结在官方文档的基础上,对操作步骤和一些关键的解释做了更详细的说明,更方便初学者入门,防止坑。本文只是入门级的开胃菜。我最终使用这个Service的目的是在我的智能家居项目中使用手机端的AbilityService实时接收服务器推送的数据,然后Service接收服务器推送的数据。之后就可以主动更新UI对应的Ability中的数据了,也就是需要打通Service主动向Activity传递数据的关键技术点。详细的开通流程会在下一篇文章中讲解,目前官网暂无。了解更多开源知识,请访问:开源基础软件社区https://ost.51cto.com。
