我把分散式音樂播放器適配了Stage模型
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模型的設計,主要是為了開發者更加方便地開發出分散式環境下的複雜應用。下表給出了兩種模型在設計上的差異:
可以看得出來,新的模型設計的主要目標是把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:程式碼目錄的調整
可以看到,相對於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模型中是透過以下程式碼實現:
而在stage模型裡,由於不再有featureAbility,因此無法import featureAbility,進而無法使用featureAbility.startAbility拉起應用,進而使用getContext獲取上下文後,呼叫startAbility拉起應用。
除了startAbility外,樣例裡使用到的獲取包含bundleName,裝置發現deviceManager的相關API都需要按照上述方法進行修改。
修改點3:資料從元件分離,提取到Ability中
在分散式拉起時,需要傳遞當前播放的音樂和音樂的播放進度。在兩種模型裡,這些引數都是被設定在wantValue的parameters裡,透過startAbility傳出去。
但在接收引數時,FA模型裡,是在當前元件的程式碼裡,透過featureAbility.getWant來獲取引數,如下程式碼。
而使用Stage模型後,雖然引數傳遞的方式是一致的,但是無法直接在元件UI中獲取引數,而需要先在MainAbility.ts獲取引數want。此時如果要傳遞給元件,有多種方式,這裡我是使用的如下方式,即在MainAbility.ts的onCreate和onNewWant裡,把want賦值到globalThis裡,然後在UI元件裡,透過globalThis獲取引數。
另外,瞭解到還有一種方式傳遞資料是使用AppStorage來關聯,比如在MainAbility.ts裡使用AppStorage.SetOrCreate<string>傳入資料,在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替換。
相關文件請參考
新增首頁頁面,和播放列表頁的動畫,不是本文的重點,大家可以參考程式碼自行學習。
總結
OpenHarmony的FA模型能力已經停止演進,後續將會增強Stage模型。此次將現有的樣例程式碼適配Stage模型,雖然整體程式碼修改量不大,但因為慣性思維以及API的變化,期間還是踩了不少坑。我已在OpenHarmony知識體系倉中更新了樣例程式碼,歡迎開發者來參考和指正問題,建議新上手OpenHarmony的開發者可以直接學習使用新的Stage模型來開發應用。前面提到在Stage模型裡,ExtensionAbility又被擴充套件為ServiceExtensionAbility、FormExtensionAbility、DataShareExtensionAbility等一系列ExtensionAbility,這個樣例目前還沒有涉及到,待後續進一步學習,透過ExtensionAbility把音樂播放實現成一個後臺服務,從而實現應用在後臺時也能繼續播放音樂,屆時將持續更新這個應用,也歡迎大家一起共建。
分散式音樂播放器樣例地址
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70011554/viewspace-2922132/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Vue全家桶打造自適應 web 音樂播放器VueWeb播放器
- vue音樂播放器Vue播放器
- win10系統怎麼把網易雲音樂設定成預設音樂播放器Win10播放器
- 音樂播放器:Swinsian for Mac播放器Mac
- TurnTable for Mac音樂播放器Mac播放器
- Listen 1音樂播放器播放器
- 千千音樂 for Mac(原百度音樂播放器)Mac播放器
- Android開源線上音樂播放器——波尼音樂Android播放器
- H5音樂播放器H5播放器
- mac音樂播放器:Decibel for MacMac播放器
- MacYouTube音樂播放器——Muse for MacMac播放器
- Mac音樂播放器——TurnTable for MacMac播放器
- TurnTable for Mac(iTunes音樂播放器)Mac播放器
- Swinsian for Mac(mac音樂播放器)Mac播放器
- 優質音樂播放器:TurnTable for Mac播放器Mac
- Clementine for Mac - 現代音樂播放器Mac播放器
- 高階音樂播放器:Swinsian for Mac播放器Mac
- Colibri for mac(無損音樂播放器)Mac播放器
- 無損音樂播放器Audirvana for mac播放器Mac
- 音樂播放器WordPress外掛 WP-Player (支援網易雲音樂, 蝦米音樂, QQ音樂, 百度音播放器
- Android開源音樂播放器之高仿雲音樂黑膠唱片Android播放器
- Sunflower音樂播放器知識點(一)播放器
- YouTube音樂播放器:Tuner for YouTube music Mac播放器Mac
- jQuery案例-網頁音樂播放器01jQuery網頁播放器
- Python實現多功能音樂播放器Python播放器
- win10 groove音樂播放器如何使用_win10系統groove音樂播放器使用操作方法Win10播放器
- Android開源音樂播放器之播放器基本功能Android播放器
- Android 音樂播放器開發實錄(MediaSession)Android播放器Session
- Linux 上最好的五款音樂播放器Linux播放器
- 如何使用 pyqt 實現 Groove 音樂播放器QT播放器
- Spotify for Mac海內外流行音樂播放器Mac播放器
- foobar2000 for mac經典音樂播放器Mac播放器
- Android開源音樂播放器之線上音樂列表自動載入更多Android播放器
- Stage模型深入解讀模型
- HTML5 實現的音樂播放器分享HTML播放器
- 一款漂亮的音樂播放器(帶介面)播放器
- TurnTable for Mac(iTunes音樂播放器)4.0.3特別版Mac播放器
- 分散式ID系列(2)——UUID適合做分散式ID嗎分散式UI