|
贝壳鸿蒙开发实践
贝壳鸿蒙开发实践
移动用户组
贝壳产品技术
贝壳产品技术 “贝壳产品技术公众号”作为贝壳官方产品技术号,致力打造贝壳产品、技术干货分享平台,面向互联网/O2O开发/产品从业者,每周推送优质产品技术文章、技术沙龙活动及招聘信息等。欢迎大家关注我们。 242篇内容
2021年12月10日 11:59
1 背景2021年6月初,华为发布了鸿蒙系统2.0版本,部分华为手机用户已提前体验到新系统带来的改变,在可预见的未来肯定会有越来越多的设备搭载鸿蒙。华为预计2021年底搭载鸿蒙操作系统的设备数量将达3亿台,面向第三方合作伙伴的各类终端设备数量超过1亿台。随着越来越多的厂商加入鸿蒙,鸿蒙生态会逐步成型,做为华为鸿蒙深度合作方和房产类app的代表,贝壳也积极拥抱变化,推出了贝壳鸿蒙服务卡片,并于2021年6月底上线。服务卡片有着随处可及、服务直达和可跨设备流转的特点,无需安装APP,用户可通过服务中心搜索打开体验服务卡片,无需打开APP即可获取服务内重要信息的展示和动态变化,十分轻量。鸿蒙服务中心:贝壳鸿蒙服务卡片:点击卡片进入房源列表:房源页(点击查看可跳转至贝壳安卓版房源):贝壳鸿蒙服务卡片目前已被鸿蒙官方选入热门服务,每日有6、7万曝光量,后续随着功能的完善,曝光量将逐步攀升。本文主要介绍鸿蒙的架构、相关特性及如何开发服务卡片。2 鸿蒙的技术架构HarmonyOS整体遵从分层设计,从下向上依次为:内核层、系统服务层、框架层和应用层。系统功能按照“系统 > 子系统 > 功能/模块”逐级展开,在多设备部署场景下,支持根据实际需求裁剪某些非必要的子系统或功能/模块。HarmonyOS技术架构如下所示。内核层:内核子系统:HarmonyOS采用多内核设计,支持针对不同资源受限设备选用适合的OS内核。驱动子系统:硬件驱动框架(HDF)是HarmonyOS硬件生态开放的基础,提供统一外设访问能力和驱动开发、管理框架。系统服务层:系统服务层是HarmonyOS的核心能力集合,通过框架层对应用程序提供服务。根据不同设备形态的部署环境,基础软件服务子系统集、增强软件服务子系统集、硬件服务子系统集内部可以按子系统粒度裁剪,每个子系统内部又可以按功能粒度裁剪。框架层:框架层为HarmonyOS应用开发提供了Java/C/C++/JS等多语言的用户程序框架和Ability框架,两种UI框架(包括适用于Java语言的Java UI框架、适用于JS语言的JS UI框架),以及各种软硬件服务对外开放的多语言框架API。根据系统的组件化裁剪程度,HarmonyOS设备支持的API也会有所不同。应用层:应用层包括系统应用和第三方非系统应用。HarmonyOS的应用由一个或多个FA(Feature Ability)或PA(Particle Ability)组成。其中,FA有UI界面,提供与用户交互的能力;而PA无UI界面,提供后台运行任务的能力以及统一的数据访问抽象。FA在进行用户交互时所需的后台数据访问也需要由对应的PA提供支撑。基于FA/PA开发的应用,能够实现特定的业务功能,支持跨设备调度与分发,为用户提供一致、高效的应用体验。3 鸿蒙的技术特性与特征3.1 四大技术特性(1) 分布式架构首次用于终端OS,实现跨终端无缝协同体验鸿蒙OS的“分布式OS架构”和“分布式软总线技术”通过公共通信平台,分布式数据管理,分布式能力调度和虚拟外设四大能力,将相应分布式应用的底层技术实现难度对应用开发者屏蔽,使开发者能够聚焦自身业务逻辑,像开发同一终端一样开发跨终端分布式应用,也使最终消费者享受到强大的跨终端业务协同能力为各使用场景带来的无缝体验。(2) 确定时延引擎和高性能IPC技术实现系统天生流畅鸿蒙 OS通过使用确定时延引擎和高性能IPC两大技术解决现有系统性能不足的问题。确定时延引擎可在任务执行前分配系统中任务执行优先级及时限进行调度处理,优先级高的任务资源将 优先保障调度,应用响应时延降低25.7%。鸿蒙微内核结构小巧的特性使IPC(进程间通信)性能大大提高,进程通信效率较现有系统提升5倍。(3) 基于微内核架构重塑终端设备可信安全鸿蒙OS采用全新的微内核设计,拥有更强的安全特性和低时延等特点。微内核设计的基本思想是简化内核功能,在内核之外的用户态尽可能多地实现系统服务,同时加入相互之间的安全保护。微内核只提供最基础的服务,比如多进程调度和多进程通信等。(4) 通过统一IDE支撑一次开发,多端部署,实现跨终端生态共享鸿蒙OS凭借多终端开发IDE,多语言统一编译,分布式架构Kit提供屏幕布局控件以及交互的自动适配,支持控件拖拽,面向预览的可视化编程,从而使开发者可以基于同一工程高效构建多端自动运行App,实现真正的一次开发,多端部署,在跨设备之间实现共享生态。华为方舟编译器是首个取代Android虚拟机模式的静态编译器,可供开发者在开发环境中一次性将高级语言编译为机器码。此外,方舟编译器未来将支持多语言统一编译,可大幅提高开发效率。3.2 鸿蒙三大特征(1)搭载该操作系统的设备在系统层面融为一体、形成超级终端,让设备的硬件能力可以弹性扩展,实现设备之间硬件互助,资源共享对消费者而言,HarmonyOS能够将生活场景中的各类终端进行能力整合,实现不同终端设备之间的快速连接、能力互助、资源共享,匹配合适的设备、提供流畅的全场景体验。(2)面向开发者,实现一次开发,多端部署。对应用开发者而言,HarmonyOS采用了多种分布式技术,使应用开发与不同终端设备的形态差异无关,从而让开发者能够聚焦上层业务逻辑,更加便捷、高效地开发应用。(3)一套操作系统可以满足不同能力的设备需求,实现统一OS,弹性部署。对设备开发者而言,HarmonyOS采用了组件化的设计方案,可根据设备的资源能力和业务特征灵活裁剪,满足不同形态终端设备对操作系统的要求。4 鸿蒙应用开发基础知识HarmonyOS的用户应用程序包以APP Pack (Application Package)形式发布,它是由一个或多个HAP(HarmonyOS Ability Package)以及描述每个HAP属性的pack.info组成。HAP是Ability的部署包,HarmonyOS应用代码围绕Ability组件展开。一个HAP是由代码、资源、第三方库及应用配置文件组成的模块包,可分为entry和feature两种模块类型。entry:应用的主模块。一个APP中,对于同一设备类型,可以有一个或多个entry类型的HAP,来支持该设备类型中不同规格(如API版本、屏幕规格等)的具体设备。如果同一设备类型存在多个entry模块,则必须配置distroFilter分发规则,使得应用市场在做应用的云端分发时,对该设备类型下不同规格的设备进行精确分发。feature:应用的动态特性模块。一个APP可以包含一个或多个feature类型的HAP,也可以不含。只有包含Ability的HAP才能够独立运行。App架构图:Ability:Ability是应用所具备的能力的抽象,一个应用可以包含一个或多个Ability。Ability分为两种类型:FA(Feature Ability)和PA(Particle Ability)。FA/PA是应用的基本组成单元,能够实现特定的业务功能。FA有UI界面,而PA无UI界面。库文件:库文件是应用依赖的第三方代码(例如so、jar、bin、har等二进制文件),存放在libs目录。资源文件:应用的资源文件(字符串、图片、音频等)存放于resources目录下,便于开发者使用和维护。配置文件:配置文件(config.json)是应用的Ability信息,用于声明应用的Ability,以及应用所需权限等信息(可类比Android中的AndroidManifest.xml)。pack.info:描述应用软件包中每个HAP的属性,由IDE编译生成,应用市场根据该文件进行拆包和HAP的分类存储。HAP的具体属性包括:delivery-with-install(表示该HAP是否支持随应用安装。“true”表示支持随应用安装;“false”表示不支持随应用安装)、name(HAP文件名)、module-type(模块类型,entry或feature)、device-type(表示支持该HAP运行的设备类型)。HAR:HAR(HarmonyOS Ability Resources)可以提供构建应用所需的所有内容,包括源代码、资源文件和config.json文件。HAR不同于HAP,HAR不能独立安装运行在设备上,只能作为应用模块的依赖项被引用(类似Android中的aar文件)。5 鸿蒙应用开发准备5.1 开发环境搭建开发鸿蒙应用需下载DevEco Studio,下载后正常安装即可。5.2 创建应用鸿蒙支持使用Java 和JS 搭建页面框架,本文主要介绍如何使用Java语言开发鸿蒙应用。5.3 工程结构解读(1) MainAbility继承自Ability,类似于Android系统中的Activity。MainAbilitySlice继承自AbilitySlice,类似于Android系统中的Fragment。Ability可通过setMainRoute设置当前展示的AbilitySlice,AbilitySlice通过setUIContent设置xml页面布局文件。Ability的生命周期如下。(2) resources文件夹存放资源文件。element文件夹类似于Android中的values文件夹,graphic中存放drawable文件,layout存放布局文件,media存放图片(3) config.json文件类似AndroidManifest文件,里面声明了应用包名、版本号、Ability、运行时需要的权限及其他配置项。具体参考如下配置文件:{"app":{"bundleName":"com.harmonyos.myapplication",//包名"vendor":"harmonyos","version":{//应用版本"code":1,"name":"1.0"},"apiVersion":{//api版本"compatible":5,"target":5,"releaseType":"Release"}},"deviceConfig":{},"module":{"package":"com.harmonyos.myapplication","name":".MyApplication","deviceType":[//设置支持的设备类型"phone"],"distro":{"deliveryWithInstall":true,"moduleName":"entry","moduleType":"entry"},"abilities":[//注册Ability{"skills":[{"entities":["entity.system.home"//设置启动的Ability],"actions":["action.system.home"]}],"orientation":"unspecified","name":"com.harmonyos.myapplication.MainAbility","icon":"$media:icon","description":"$string:mainability_description","label":"$string:app_name","type":"page","launchType":"standard"}],"reqPermissions":[//配置需要的权限{"name":"ohos.permission.servicebus.ACCESS_SERVICE"},{"name":"ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE"},{"name":"ohos.permission.INTERNET"},{"name":"ohos.permission.LOCATION","reason":"为了提供更精准的服务,需要获取您的位置","usedScene":{"ability":["com.harmonyos.beike.ability.HouseDetailAbility"],"when":"inuse"}},{"name":"ohos.permission.GET_NETWORK_INFO"},{"name":"ohos.permission.R"}]}}(4) 鸿蒙APP也是通过gradle构建工程,因此两个build.gradle文件也与Android类似6 开发鸿蒙服务卡片6.1 创建卡片创建卡片需要依附于Ability,在Ability中相关的方法有四个:onCreateForm(创建卡片调用),onUpdateForm (系统定时更新卡片调用),onDeleteForm(删除卡片调用),updateForm(当需要主动更新卡片时调用)卡片架构如图所示:创建卡片代码如下:@OverrideprotectedProviderFormInfoonCreateForm(Intentintent){Imageimage=newImage(this);StringformName=intent.getStringParam(AbilitySlice.PARAM_FORM_NAME_KEY);intformId=intent.getIntParam(AbilitySlice.PARAM_FORM_ID_KEY,-1);intdimension=intent.getIntParam(AbilitySlice.PARAM_FORM_DIMENSION_KEY,DEFAULT_DIMENSION_2X2);intresId=ResourceTable.Layout_form_list_pattern_house_list_card_2_2;if(formName.equals("house_list_card")){switch(dimension){caseDEFAULT_DIMENSION_2X2:resId=ResourceTable.Layout_form_list_pattern_house_list_card_2_2;break;caseDIMENSION_2X4:resId=ResourceTable.Layout_form_list_pattern_house_list_card_2_4;break;}}ComponentProvidercomponentProvider=newComponentProvider(resId,MainAbility.this);componentProvider.setIntentAgent(ResourceTable.Id_title,openDetail());//设置点击事件componentProvider.setText(ResourceTable.Id_title_house1,"鸿蒙");//设置textcomponentProvider.setVisibility(ResourceTable.Id_empty_image,Component.HIDE);//设置控件是否可见componentProvider.setImagePixelMap(ResourceTable.Id_img_house1,pixelMap);//设置图片try{updateForm(formId,componentProvider);//调用系统API更新卡片}catch(FormExceptione){e.printStackTrace();}returnnewProviderFormInfo(resId,this);}/***添加卡片的点击跳转事件*/privateIntentAgentopenDetail(){//设置先打开列表页面Intentintent1=newIntent();Operationoperation1=newIntent.OperationBuilder().withDeviceId("").withBundleName("com.harmonyos.example").withAbilityName("com.harmonyos.example.ability.ListAbility").build();intent1.setOperation(operation1);//再设置打开页面,这样页关闭后就会展示列表页面Intentintent=newIntent();Operationoperation=newIntent.OperationBuilder().withDeviceId("").withBundleName("com.harmonyos.example").withAbilityName("com.harmonyos.example.ability.DetailAbility").build();intent.setParam("from","FACard");intent.setOperation(operation);intent.setParam("houseCode",actionUrl);intent.setParam("from","FACard");ListintentList=newArrayList();intentList.add(intent1);intentList.add(intent);Listflags=newArrayList();flags.add(IntentAgentConstant.Flags.UPDATE_PRESENT_FLAG);flags.add(IntentAgentConstant.Flags.UPDATE_PRESENT_FLAG);IntentAgentInfoparamsInfo=newIntentAgentInfo(requestCode,IntentAgentConstant.OperationType.START_ABILITIES,flags,intentList,null);//START_ABILITIES打开多个页面IntentAgentintentAgent=IntentAgentHelper.getIntentAgent(this,paramsInfo);returnintentAgent;}}6.2 卡片信息配置在config.json配置文件里对应的Ability下方配置卡片信息"forms":[{"landscapeLayouts":["$layout:form_list_pattern_house_list_card_2_2",//卡片对应的布局2*2大小"$layout:form_list_pattern_house_list_card_2_4"//卡片对应的布局2*4大小],"isDefault":true,"scheduledUpdateTime":"10:30",//定点更新时间"defaultDimension":"2*2",//默认展示的布局"name":"house_list_card","description":"房源捡漏榜卡片",//展示的卡片名称"colorMode":"auto","type":"Java",//使用Java代码"supportDimensions":[//支持的卡片大小"2*2","2*4"],"portraitLayouts":["$layout:form_list_pattern_house_list_card_2_2",//2*2卡片布局"$layout:form_list_pattern_house_list_card_2_4"//2*4卡片布局],"updateEnabled":true,"updateDuration":30//刷新周期单位是30分钟}]在module下加入以下代码可设置卡片免安装"distro":{"deliveryWithInstall":true,"moduleName":"entry","moduleType":"entry","installationFree":true}6.3 布局开发鸿蒙布局开发和Android一样,可以使用xml开发,开发卡片时需要在根布局设置ohos:remote="true"。下面表格展示了一些基本的鸿蒙和安卓对应的UI控件,使用和特性上都大同小异。使用时也可以通过Java代码进行布局。功能鸿蒙AndroidToast提示ToastDialogToast列表ListContainerListView图片ImageImageView帧布局StackLayoutFrameLayout文本TextTextView滑动切换容器PageSliderViewPager滚动列表ScrollViewScrollView相对布局DependentLayoutRelativeLayout线性布局DirectionalLayoutLinearLayout网页WebViewWebView6.4 运行调试可通过真机和模拟器运行并调试应用。如果需要在真机设备上调试应用,则在编译前需要先申请调试证书,并配置签名信息。以便于在编译构建时,生成带签名信息的HAP。如果在模拟器上调试应用,则不需要签名,直接编译构建HAP即可。7 常见问题问题1:当通过gradle implemention引入第三方SDK时,报错No such property: name for class: com.huawei.ohos.build.tasks.manager.DependencyManager原因:引入的库包含Android API,或者打成了aar包,这些都不能在鸿蒙中使用。需要重新打包成jar或者har包。问题2:使用ScrollView时,页面滚动不了解决:在xml中设置ScrollView的height不能是match_parent,应该使用match_content或者具体高度ScrollView>ScrollView>问题3:使用webview无法加载https解决:WebView默认只支持https请求,想要支持http请求需要在config.json配置文件中添加如下配置项"deviceConfig":{"default":{"network":{"cleartextTraffic":true}},"phone":{"network":{"cleartextTraffic":true,"securityConfig":{"domainSettings":{"cleartextPermitted":true}}}}}问题4:使用适配了鸿蒙系统的glide库的glide的centerCrop()方法加载图片,有些图片在低分辨率下显示不出来解决:使用如下代码加载Glide.with(mContext).asBitmap().load(images.get(i).imgUrl).into(newSimpleTarget(){@OverridepublicvoidonResourceReady(@NotNullPixelMapelement,@NullableTransitionsuperPixelMap>transition){image.setScaleMode(Image.ScaleMode.CLIP_CENTER);image.setPixelMap(element);}});问题5:在没有启动hap或者杀掉hap进程的前提下(例如开发鸿蒙桌面服务卡片),直接在桌面创建卡片,展示图片时报错:java.lang.UnsatisfiedLinkError;解决:这种情况获取不到上下文,在onCreateForm中提前创建一个空的布局组件,即可解决此问题。@OverrideprotectedProviderFormInfoonCreateForm(Intentintent){Imageimage=newImage(this);//创建一个空的Image控件StringformName=intent.getStringParam(AbilitySlice.PARAM_FORM_NAME_KEY);intformId=intent.getIntParam(AbilitySlice.PARAM_FORM_ID_KEY,-1);intdimension=intent.getIntParam(AbilitySlice.PARAM_FORM_DIMENSION_KEY,DEFAULT_DIMENSION_2X2);intresId=ResourceTable.Layout_form_list_pattern_house_list_card_2_2;if(formName.equals("house_list_card")){switch(dimension){caseDEFAULT_DIMENSION_2X2:resId=ResourceTable.Layout_form_list_pattern_house_list_card_2_2;break;caseDIMENSION_2X4:resId=ResourceTable.Layout_form_list_pattern_house_list_card_2_4;break;}}}8 贝壳鸿蒙版未来规划8.1 基于鸿蒙特性+看房/购房应用场景鸿蒙OS打破了设备间的壁垒,对用户及应用开发者来说,形成了超级终端。超级终端包含手机、大屏、平板,未来或许会有更多的设备加入,设备间协同合作让购物体验变得优质。每个设备不再是孤立的个体,而是基于鸿蒙操作系统的智慧终端,即便用户拿着不同的设备,也可以有很好的体验。通过一键流转实现跨设备间的数据传输,从而实现无缝的购房体验。流转泛指多设备间的分布式操作,打破设备界限,多设备联动,使用户应用程序可分可合、可流转。流转按照体验可分为跨端迁移和多端协同。流转支持免安装运行FA。如目前的直播看房、VR带看等功能,将当前手机的直播流转至TV端,做到无缝衔接,并支持通过手机端控制TV端直播显示的功能。8.2 FA近场&畅联分享-房源FAFA近场分享能力依赖于华为分享服务,可以快速实现FA分享的功能。较单纯的使用分布式FA流转功能,为开发者免除了设备发现功能,并且没有了同账号同网络等限制条件。如可在房源FA就可以使用此功能实现FA的近场分享,并且能够做到免安装。
预览时标签不可点
移动端37鸿蒙1大前端69移动端 · 目录#移动端上一篇贝壳Flutter混合工程集成方案下一篇Native和Flutter混合开发ViewPager的解决方案关闭更多小程序广告搜索「undefined」网络结果
|
|