自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

我把分布式音樂播放器適配了Stage模型

系統(tǒng) OpenHarmony
分布式音樂播放器,是今年上半年我基于OpenHarmony 3.1,參考OpenHarmony JS分布式音樂播放的Sample代碼,使用ArkTS新寫的樣例,當(dāng)時的主要目的就是為了學(xué)習(xí)ArkTS開發(fā)頁面。

??想了解更多關(guān)于開源的內(nèi)容,請訪問:??

??51CTO 開源基礎(chǔ)軟件社區(qū)??

??https://ost.51cto.com??

OpenAtom OpenHarmony(以下簡稱“OpenHarmony”)應(yīng)用開發(fā)自API 8及其更早版本一直使用的是FA模型進(jìn)行開發(fā)。FA模型是Feature Ability的縮寫,它和PA(Particle Ability)兩種類型是過往長期推廣的術(shù)語,深入人心。

然而從API 9開始,Ability框架引入了Stage模型作為第二種應(yīng)用框架形態(tài),Stage模型將Ability分為PageAbility和ExtensionAbility兩大類,其中ExtensionAbility又被擴展為ServiceExtensionAbility、FormExtensionAbility、DataShareExtensionAbility等一系列ExtensionAbility,以便滿足更多的使用場景。新模型接口中有AbilityStage/WindowStage的概念,這個Stage本身有舞臺的意思,寓意是給開發(fā)者一個新的展現(xiàn)舞臺。Stage模型的設(shè)計,主要是為了開發(fā)者更加方便地開發(fā)出分布式環(huán)境下的復(fù)雜應(yīng)用。下表給出了兩種模型在設(shè)計上的差異:

我把分布式音樂播放器適配了Stage模型-開源基礎(chǔ)軟件社區(qū)

可以看得出來,新的模型設(shè)計的主要目標(biāo)是把UI與Ability分離,即從架構(gòu)設(shè)計層面,規(guī)范開發(fā)者編寫業(yè)務(wù)邏輯和UI交互的開發(fā)方式。通過數(shù)據(jù)把UI和業(yè)務(wù)邏輯解耦,開發(fā)者在Ability中產(chǎn)生數(shù)據(jù),數(shù)據(jù)傳遞給UI框架后,利用ArkTS聲明式框架的特點,UI=F(state),通過數(shù)據(jù)驅(qū)動UI變化。這樣的設(shè)計是為了更好地支持Ability實現(xiàn)跨端遷移和多端協(xié)同,即數(shù)據(jù)都是存儲在Ability里,繼而通過數(shù)據(jù)驅(qū)動UI展示。此外,F(xiàn)A模型每個Ability使用一個VM實例,而Stage模型整個進(jìn)程只使用一個VM實例,減少進(jìn)程內(nèi)存占用,應(yīng)用內(nèi)狀態(tài)在進(jìn)程內(nèi)共享。

分布式音樂播放器,是今年上半年我基于OpenHarmony 3.1,參考OpenHarmony JS分布式音樂播放的Sample代碼,使用ArkTS新寫的樣例,當(dāng)時的主要目的就是為了學(xué)習(xí)ArkTS開發(fā)頁面。此次適配Stage模型后,在潤和大禹系列HH-SCDAYU200開發(fā)套件上,效果如下圖所示:

我把分布式音樂播放器適配了Stage模型-開源基礎(chǔ)軟件社區(qū)

可以看到,此次更新,不僅使用了Stage模型適配,還使用ArkTS增加了一個音樂播放器首頁列表的界面,以及播放時使用屬性動畫,實現(xiàn)了一個播放音樂時“唱片旋轉(zhuǎn)”的動畫效果。這次使用Stage模型適配樣例,主要是修改了如下幾個地方:

修改點1:代碼目錄的調(diào)整

我把分布式音樂播放器適配了Stage模型-開源基礎(chǔ)軟件社區(qū)

可以看到,相對于FA的目錄結(jié)構(gòu),首先是在最上層目錄里,增加了一個AppScope目錄,這個目錄下也是resources下的資源文件,比如string.json,圖片等內(nèi)容。這個目錄里的資源文件,會在編譯時拼接到具體的hap內(nèi)編譯,因此可以把不同hap包里的公用資源提取到這個目錄下。

此外是增加了AbilityStage.ts這個文件,它是Hap及加載入口,開發(fā)者可以基于它派生完成hap的初始化以及指定多個實例開發(fā)。AbilityStage可以配合ApplicationContext監(jiān)聽/管理進(jìn)程內(nèi)組件的生命周期,感覺是有點充當(dāng)了FA模型里的app.ets的作用。

其它的文件也有小的變化,如配置文件,pages位置等都有調(diào)整。所以建議還是新建一個stage模型的工程,然后把之前的代碼逐步復(fù)制過來,然后修改問題。

修改點2:獲取設(shè)備列表,分布式拉起等API變化

由于兩種模型的應(yīng)用上下文不同,導(dǎo)致一些跟上下文相關(guān)的API大都有些變化,在SDK及文檔中有明確標(biāo)明哪些API是stage模型專用的。比如耳熟能詳?shù)膕tartAbility分布式拉起應(yīng)用,在FA模型中是通過以下代碼實現(xiàn):

import featureAbility from '@ohos.ability.featureAbility';
featureAbility.startAbility({
want: wantValue
}).then((data) => {
CommonLog.info('startAbilityContinuation finished, ' + JSON.stringify(data))
//拉起后,自我關(guān)閉
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,進(jìn)而無法使用featureAbility.startAbility拉起應(yīng)用,進(jìn)而使用getContext獲取上下文后,調(diào)用startAbility拉起應(yīng)用。

getContext(this).startAbility(want).then((data) => {
CommonLog.info('startAbilityContinuation finished, ' + JSON.stringify(data))
//自我關(guān)閉
getContext(this).terminateSelf((error) => {
CommonLog.info('startAbilityContinuation terminateSelf finished, error=' + JSON.stringify(error))
})
}).catch((error) => {
CommonLog.info('startAbilityContinuation error ' + JSON.stringify(error))
})

除了startAbility外,樣例里使用到的獲取包含bundleName,設(shè)備發(fā)現(xiàn)deviceManager的相關(guān)API都需要按照上述方法進(jìn)行修改。

修改點3:數(shù)據(jù)從組件分離,提取到Ability中

在分布式拉起時,需要傳遞當(dāng)前播放的音樂和音樂的播放進(jìn)度。在兩種模型里,這些參數(shù)都是被設(shè)置在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
}

但在接收參數(shù)時,F(xiàn)A模型里,是在當(dāng)前組件的代碼里,通過featureAbility.getWant來獲取參數(shù),如下代碼。

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模型后,雖然參數(shù)傳遞的方式是一致的,但是無法直接在組件UI中獲取參數(shù),而需要先在MainAbility.ts獲取參數(shù)want。此時如果要傳遞給組件,有多種方式,這里我是使用的如下方式,即在MainAbility.ts的onCreate和onNewWant里,把want賦值到globalThis里,然后在UI組件里,通過globalThis獲取參數(shù)。

// 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)
}

另外,了解到還有一種方式傳遞數(shù)據(jù)是使用AppStorage來關(guān)聯(lián),比如在MainAbility.ts里使用AppStorage.SetOrCreate<string>傳入數(shù)據(jù),在UI組件里,使用@StorageLink標(biāo)簽修飾變量來獲取數(shù)據(jù)。

除以上三點修改外,還有兩點值得說明下

首先是因OpenHarmony 3.2后分布式能力限制智能系統(tǒng)應(yīng)用使用,需要提升apl等級:找到所使用API版本對應(yīng)toolchains>版本號>lib>UnsgnedReleasedProfileTemplate.json,更改 "apl": "normal"為 "apl": "system_core"。

其次是API 9以后區(qū)分了public-SDK和Full SDK。DevEco Studio默認(rèn)下載的是public-SDK,它不包含系統(tǒng)應(yīng)用所需要的高權(quán)限API。當(dāng)我們import deviceManager from '@ohos.distributedHardware.deviceManager'時,會發(fā)現(xiàn)里面只有一個空的接口,沒有任何方法。雖然這不影響功能,但代碼中必須使用@ts-ignore忽略typescript的告警,而且沒有語法提示。此時,需要使用full-SDK替換。

相關(guān)文檔請參考:

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

新增首頁頁面,和播放列表頁的動畫,不是本文的重點,大家可以參考代碼自行學(xué)習(xí)。

總結(jié)

OpenHarmony的FA模型能力已經(jīng)停止演進(jìn),后續(xù)將會增強Stage模型。此次將現(xiàn)有的樣例代碼適配Stage模型,雖然整體代碼修改量不大,但因為慣性思維以及API的變化,期間還是踩了不少坑。我已在OpenHarmony知識體系倉中更新了樣例代碼,歡迎開發(fā)者來參考和指正問題,建議新上手OpenHarmony的開發(fā)者可以直接學(xué)習(xí)使用新的Stage模型來開發(fā)應(yīng)用。前面提到在Stage模型里,ExtensionAbility又被擴展為ServiceExtensionAbility、FormExtensionAbility、DataShareExtensionAbility等一系列ExtensionAbility,這個樣例目前還沒有涉及到,待后續(xù)進(jìn)一步學(xué)習(xí),通過ExtensionAbility把音樂播放實現(xiàn)成一個后臺服務(wù),從而實現(xiàn)應(yīng)用在后臺時也能繼續(xù)播放音樂,屆時將持續(xù)更新這個應(yīng)用,也歡迎大家一起共建。

???想了解更多關(guān)于開源的內(nèi)容,請訪問:??

??51CTO 開源基礎(chǔ)軟件社區(qū)??

??https://ost.51cto.com

責(zé)任編輯:jianghua 來源: 51CTO開源基礎(chǔ)軟件社區(qū)
相關(guān)推薦

2021-08-24 15:13:06

鴻蒙HarmonyOS應(yīng)用

2021-10-19 14:27:07

鴻蒙HarmonyOS應(yīng)用

2021-10-21 16:00:07

鴻蒙HarmonyOS應(yīng)用

2011-06-27 11:23:21

Qt 音樂播放器

2014-12-31 16:52:53

音樂播放器源碼

2022-12-26 11:24:28

鴻蒙Stage模型

2009-12-17 15:10:31

Linux音樂播放器

2023-10-26 18:10:43

分布式并行技術(shù)系統(tǒng)

2019-02-11 09:20:35

Linux音樂播放器

2011-04-06 10:03:45

谷歌云計算Android音

2017-03-01 14:01:31

android多媒體音樂代碼

2017-02-20 09:15:34

Linux播放器Qmmp

2011-08-30 09:48:07

Ubuntu

2022-06-28 14:23:51

分布式音樂播放器

2013-07-23 17:55:14

酷狗音樂mac

2009-06-17 09:56:23

網(wǎng)絡(luò)音樂播放器

2009-08-05 09:48:42

iPod自爆

2012-04-05 13:19:06

WEBHTML5

2011-08-30 13:18:43

UbuntuQmmp

2021-02-01 09:35:53

關(guān)系型數(shù)據(jù)庫模型
點贊
收藏

51CTO技術(shù)棧公眾號