0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

我把分布式音乐播放器适配了Stage模型

OpenAtom OpenHarmony 来源:未知 2022-11-03 23:05 次阅读

点击蓝字 ╳ 关注我们

开源项目 OpenHarmony是每个人的 OpenHarmony 880c44d6-5b88-11ed-a3b6-dac502259ad0.png

马迪欣

OpenHarmony知识体系工作组

以下内容来自嘉宾分享,不代表开放原子开源基金会观点 OpenAtom OpenHarmony(以下简称“OpenHarmony”)应用开发自API 8及其更早版本一直使用的是FA模型进行开发。FA模型是Feature Ability的缩写,它和PA(Particle Ability)两种类型是过往长期推广的术语,深入人心。 然而从API 9开始,Ability框架引入了Stage模型作为第二种应用框架形态,Stage模型将Ability分为PageAbility和ExtensionAbility两大类,其中ExtensionAbility又被扩展为ServiceExtensionAbility、FormExtensionAbility、DataShareExtensionAbility等一系列ExtensionAbility,以便满足更多的使用场景。新模型接口中有AbilityStage/WindowStage的概念,这个Stage本身有舞台的意思,寓意是给开发者一个新的展现舞台。Stage模型的设计,主要是为了开发者更加方便地开发出分布式环境下的复杂应用。下表给出了两种模型在设计上的差异: 88356d8e-5b88-11ed-a3b6-dac502259ad0.png   可以看得出来,新的模型设计的主要目标是把UI与Ability分离,即从架构设计层面,规范开发者编写业务逻辑和UI交互的开发方式。通过数据把UI和业务逻辑解耦,开发者在Ability中产生数据,数据传递给UI框架后,利用ArkTS声明式框架的特点,UI=F(state),通过数据驱动UI变化。这样的设计是为了更好地支持Ability实现跨端迁移和多端协同,即数据都是存储在Ability里,继而通过数据驱动UI展示。此外,FA模型每个Ability使用一个VM实例,而Stage模型整个进程只使用一个VM实例,减少进程内存占用,应用内状态在进程内共享。   分布式音乐播放器,是今年上半年我基于OpenHarmony 3.1,参考OpenHarmony JS分布式音乐播放的Sample代码,使用ArkTS新写的样例,当时的主要目的就是为了学习ArkTS开发页面。此次适配Stage模型后,在润和大禹系列HH-SCDAYU200开发套件上,效果如下图所示     可以看到,此次更新,不仅使用了Stage模型适配,还使用ArkTS增加了一个音乐播放器首页列表的界面,以及播放时使用属性动画,实现了一个播放音乐时“唱片旋转”的动画效果。这次使用Stage模型适配样例,主要是修改了如下几个地方:  修改点1:代码目录的调整885ce5e4-5b88-11ed-a3b6-dac502259ad0.png   可以看到,相对于FA的目录结构,首先是在最上层目录里,增加了一个AppScope目录,这个目录下也是resources下的资源文件,比如string.json,图片等内容。这个目录里的资源文件,会在编译时拼接到具体的hap内编译,因此可以把不同hap包里的公用资源提取到这个目录下。 此外是增加了AbilityStage.ts这个文件,它是Hap及加载入口,开发者可以基于它派生完成hap的初始化以及指定多个实例开发。AbilityStage可以配合ApplicationContext监听/管理进程内组件的生命周期,感觉是有点充当了FA模型里的app.ets的作用。 其它的文件也有小的变化,如配置文件,pages位置等都有调整。所以建议还是新建一个stage模型的工程,然后把之前的代码逐步复制过来,然后修改问题。  修改点2:获取设备列表,分布式拉起等API变化 由于两种模型的应用上下文不同,导致一些跟上下文相关的API大都有些变化,在SDK及文档中有明确标明哪些API是stage模型专用的。比如耳熟能详的startAbility分布式拉起应用,在FA模型中是通过以下代码实现:
import featureAbility from '@ohos.ability.featureAbility';


   featureAbility.startAbility({
      want: wantValue
    }).then((data) => {
      CommonLog.info('startAbilityContinuation finished, ' + JSON.stringify(data))


      //拉起后,自我关闭
      featureAbility.terminateSelf((error) => {
        CommonLog.info('startAbilityContinuation terminateSelf finished, error=' + JSON.stringify(error))
      })
    }).catch((error) => {
      CommonLog.info('startAbilityContinuation error ' + JSON.stringify(error))
})
而在stage模型里,由于不再有featureAbility,因此无法import featureAbility,进而无法使用featureAbility.startAbility拉起应用,进而使用getContext获取上下文后,调用startAbility拉起应用。
    getContext(this).startAbility(want).then((data) => {
      CommonLog.info('startAbilityContinuation finished, ' + JSON.stringify(data))


      //自我关闭
      getContext(this).terminateSelf((error) => {
        CommonLog.info('startAbilityContinuation terminateSelf finished, error=' + JSON.stringify(error))
      })
    }).catch((error) => {
      CommonLog.info('startAbilityContinuation error ' + JSON.stringify(error))
})
除了startAbility外,样例里使用到的获取包含bundleName,设备发现deviceManager的相关API都需要按照上述方法进行修改。 修改点3:数据从组件分离,提取到Ability中 在分布式拉起时,需要传递当前播放的音乐和音乐的播放进度。在两种模型里,这些参数都是被设置在wantValue的parameters里,通过startAbility传出去。
   let params = {
      index: this.playerManager.getCurrentMusicIndex(),
      seekTo: this.playerManager.getCurrentTimeMs(),
      isPlaying: this.isPlaying
    }
    let wantValue = {
      bundleName: this.bundleName,
      abilityName: 'com.madixin.music.MainAbility',
      deviceId: remoteDevice.deviceId,
      parameters: params
}
但在接收参数时,FA模型里,是在当前组件的代码里,通过featureAbility.getWant来获取参数,如下代码。
  featureAbility.getWant((error, want) => {
      CommonLog.info('restoreFromWant featureAbility.getWant=' + JSON.stringify(want))
      let status = want.parameters
      if (status != null && status.index != null) {
        this.playerManager.playSpecifyMusic(status.seekTo, status.index)
        this.isPlaying = true
        this.playAnimation()
      }
})
而使用Stage模型后,虽然参数传递的方式是一致的,但是无法直接在组件UI中获取参数,而需要先在MainAbility.ts获取参数want。此时如果要传递给组件,有多种方式,这里我是使用的如下方式,即在MainAbility.ts的onCreate和onNewWant里,把want赋值到globalThis里,然后在UI组件里,通过globalThis获取参数。
    // MainAbility.ts
    onNewWant(want, launchParams) {
        globalThis.newWant = want
        hilog.info(0x0000, 'MyOpenHarmonyPlayer', '%{public}s', 'onNewWant launchParam:' + JSON.stringify(launchParams) ?? '');
    }


    onCreate(want, launchParam) {
        globalThis.newWant = want
        hilog.info(0x0000, 'MyOpenHarmonyPlayer', '%{public}s', 'want param:' + JSON.stringify(want) ?? '');
        hilog.info(0x0000, 'MyOpenHarmonyPlayer', '%{public}s', 'launchParam:' + JSON.stringify(launchParam) ?? '');
    }
    
    // index.ets
    let newWant = globalThis.newWant
    CommonLog.info("aboutToAppear newWant:" + JSON.stringify(newWant))
    if (newWant !== null && newWant.parameters.hasOwnProperty("seekTo")) {
      this.playerManager.playSpecifyMusic(newWant.parameters.seekTo, newWant.parameters.index)
}
另外,了解到还有一种方式传递数据是使用AppStorage来关联,比如在MainAbility.ts里使用AppStorage.SetOrCreate传入数据,在UI组件里,使用@StorageLink标签修饰变量来获取数据。 除以上三点修改外,还有两点值得说明下 首先是因OpenHarmony 3.2后分布式能力限制智能系统应用使用,需要提升apl等级:找到所使用API版本对应toolchains>版本号>lib>UnsgnedReleasedProfileTemplate.json,更改 "apl": "normal"为 "apl": "system_core"。 其次是API 9以后区分了public-SDK和Full SDK。DevEco Studio默认下载的是public-SDK,它不包含系统应用所需要的高权限API。当我们import deviceManager from '@ohos.distributedHardware.deviceManager'时,会发现里面只有一个空的接口,没有任何方法。虽然这不影响功能,但代码中必须使用@ts-ignore忽略typescript的告警,而且没有语法提示。此时,需要使用full-SDK替换。 相关文档请参考

https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/quick-start/full-sdk-switch-guide.md

新增首页页面,和播放列表页的动画,不是本文的重点,大家可以参考代码自行学习。

总结

OpenHarmony的FA模型能力已经停止演进,后续将会增强Stage模型。此次将现有的样例代码适配Stage模型,虽然整体代码修改量不大,但因为惯性思维以及API的变化,期间还是踩了不少坑。我已在OpenHarmony知识体系仓中更新了样例代码,欢迎开发者来参考和指正问题,建议新上手OpenHarmony的开发者可以直接学习使用新的Stage模型来开发应用。 前面提到在Stage模型里,ExtensionAbility又被扩展为ServiceExtensionAbility、FormExtensionAbility、DataShareExtensionAbility等一系列ExtensionAbility,这个样例目前还没有涉及到,待后续进一步学习,通过ExtensionAbility把音乐播放实现成一个后台服务,从而实现应用在后台时也能继续播放音乐,届时将持续更新这个应用,也欢迎大家一起共建。 分布式音乐播放器样例地址

https://growing.openharmony.cn/mainPlay/detail?sampleId=3742


原文标题:我把分布式音乐播放器适配了Stage模型

文章出处:【微信公众号:OpenAtom OpenHarmony】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 鸿蒙
    +关注

    关注

    55

    文章

    2123

    浏览量

    42274
  • OpenHarmony
    +关注

    关注

    24

    文章

    3486

    浏览量

    15424

原文标题:我把分布式音乐播放器适配了Stage模型

文章出处:【微信号:gh_e4f28cfa3159,微信公众号:OpenAtom OpenHarmony】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    想听就听,安卓平台音乐播放器精选

    喜欢一直放在手心。接听电话、听音乐两不耽误,并且现在的手机音乐播放器还能显示歌词,显示专辑封面,以及你想听什么歌曲,可以随时搜一下,唾手可得,你再也不必每天连接MP3播放器到电脑上为选
    发表于 07-13 15:27

    如果的诺基亚设备在音乐播放器 (或多媒体播放器) 中未能

    如果的诺基亚设备在音乐播放器 (或多媒体播放器) 中未能显示新的音乐文件,该怎么办?刷新或更新音乐
    发表于 01-23 17:40

    基于FPGA设计多功能音乐播放器

    想设计一个音乐播放器,运用Altera公司的EP1C3144C8,能够实现暂停,快进,下一首播放,以及在点阵图上显示当前播放音乐的的简谱数
    发表于 11-27 15:40

    音乐播放器

    音乐播放器播放和暂停
    发表于 05-28 17:30

    做一个音乐播放器

    大家集思广益,做一个音乐播放器,要求能播放多种格式的音乐文件具有选择播放文件的功能,声音大小可调能录音,并能回放,任意设置
    发表于 07-01 11:12

    求助,谁有基于labview的音乐播放器

    谁有基于labview的音乐播放器,能实现显示当前音乐名,播放列表,音量调节,切歌,顺序、循环播放
    发表于 01-06 15:00

    labview音乐播放器音质转换

    用labview做个音乐播放器,但是如何输入的文件音乐改变其音质,例如男声变为女声。大佬会的给点提示参考参考?急求!!!
    发表于 05-10 10:34

    基于战舰板的遥控音乐播放器

    2012年买的战舰板,有较长时间放着吃灰觉得很可惜。感觉战舰板的音乐播放器音质蛮不错的,于是想就折腾一个遥控音乐播放器。貌似很简单的事,实际上
    发表于 07-01 04:35

    基于fpga的音乐播放器设计

    的控制频率来完成产生不同音调的声音,从而完成达到简单音乐播放的效果。通过蜂鸣器来实现控制频率达到音乐播放的效果很符合我们所学知识,能够充分应用我们在课堂及实验里学习的技能,因此
    发表于 04-02 12:24

    基于润和DAYU200开发套件的OpenHarmony分布式音乐播放器

    RJ45以太网口,可满足NVR、工业网关等多网口产品需求。分布式音乐播放器这里给大家分享一个样例,分布式音乐
    发表于 03-14 09:07

    DistributedVideoPlayer分布式视频播放器的设计资料

    1、DistributedVideoPlayer分布式视频播放器的设计资料(一)本示例是在官方Video Play Ability 模板基础上做了扩展开发,官方模板提供基本的视频播放功能,并允许您在
    发表于 03-22 11:55

    求一种基于DAYU200开发套件的分布式音乐播放器设计方案

    、音频、视频和摄像头等功能,拥有丰富的扩展接口,支持多种视频输入输出接口;配置双千兆自适应RJ45以太网口,可满足NVR、工业网关等多网口产品需求。分布式音乐播放器这里给大家分享一个样例,分布
    发表于 09-08 17:22

    分布式音乐播放器适配了Stage模型

    Ability使用一个VM实例,而Stage模型整个进程只使用一个VM实例,减少进程内存占用,应用内状态在进程内共享。分布式音乐播放器,是今
    发表于 11-07 11:43

    网页音乐播放器代码

    网页音乐播放器代码:有MP3的,有Windows Media Player音乐播放器代码的,也有视频的,
    发表于 01-10 11:18 86次下载

    鸿蒙HarmonyOS开发实战:【分布式音乐播放

    本示例使用fileIo获取指定音频文件,并通过AudioPlayer完成了音乐播放完成了基本的音乐播放、暂停、上一曲、下一曲功能;并使用DeviceManager完成了
    的头像 发表于 04-10 17:51 524次阅读
    鸿蒙HarmonyOS开发实战:【<b class='flag-5'>分布式</b><b class='flag-5'>音乐</b><b class='flag-5'>播放</b>】