天天看點

『鴻蒙開發筆記』高負載服務流轉的解決方案

大家好,我們是HarmonyOS開發者創新大賽的參賽作品《主題協作器》。這一期内容,主要帶大家了解一下,服務流轉需要攜帶較多資料量時的解決方案。

『鴻蒙開發筆記』高負載服務流轉的解決方案

标準的HarmonyOS應用流轉主要有兩種形式,一種是使用IAbilityContinuation中的onSaveData與onRestoreData方法,另一種則是在使用startAbility前,為intent意圖附上被流轉裝置的DeviceId。

『鴻蒙開發筆記』高負載服務流轉的解決方案

在某些特定的場景下,我們的APP可能需要傳遞較大的資料量,如果直接采用标準的兩種流轉方式,很容易造成線程擁堵,以及較長的空白頁等待。為此,我們采用了多線程與過渡頁的形式,打造了一套獨特的解決方案:

1、使用者發起流轉指令後,裝置甲中的AbilitySlice會使用startAbility的方式,喚起裝置乙上的配套Ability,但本次喚起不會傳遞任何大型檔案資料。同時,裝置乙上的配套Ability會優先使用StackLayout中的上級遮蓋圖層,即流轉過渡頁圖層,以營造轉場過渡效果。

『鴻蒙開發筆記』高負載服務流轉的解決方案

2、裝置甲在收到流轉指令時,會事先配上一份回調函數,待裝置乙上的過渡頁渲染完畢,裝置甲會向裝置乙發起二次喚起。我們的Ability采用的是singleton單執行個體模式,進行二次回調喚起時,裝置乙一定是在onNewIntent中發生的。二次喚起時,由于裝置乙已渲染過相關轉場圖層,這時我們隻需要再建立一個多線程計劃,然後在新的線程裡完成大型的檔案傳輸,并在傳輸完成後通知主線程對上方過渡圖層作Hide處理,即可順利營造流轉過渡效果,使用者感覺起來也更自然、更美觀!

『鴻蒙開發筆記』高負載服務流轉的解決方案

3、由于我們沒有采用AbilityContinuation中的onSaveData與onRestoreData方法,是以我們在完成上述檔案傳輸時,需要運用到分布式檔案服務,即getDistributedDir接口。當使用者發起流轉指令,裝置甲會将需要流轉的視訊、圖檔等較大檔案,先複制到本端的分布式目錄。考慮到裝置甲通常是在AbilitySlice中發起流轉的,而被流轉的裝置乙,僅可通過配套的Ability承接,這樣各端在使用getDistributedDir接口時,就會出現擷取的分布式目錄不一緻,進而找不到需要跨端傳遞的檔案。是以,裝置甲會在二次回掉喚起裝置乙中的Ability時,在Intent内一并附上裝置甲的分布式目錄名與其它文本參數,以供裝置乙承接。

『鴻蒙開發筆記』高負載服務流轉的解決方案

4、當使用者在被流轉的裝置乙上,對部分參數或檔案進行修改,也可以再次點選裝置乙中的流轉按鈕發起回遷。回遷流程與上述流程幾乎一緻,唯一的差別是:裝置乙作為流轉發起端時,通常是在Ability中進行的,而裝置甲通常在AbilitySlice中進行。除非,使用者在裝置乙回遷至裝置甲的相關Ability中,再次發起了流轉。

『鴻蒙開發筆記』高負載服務流轉的解決方案

5、如果使用者将裝置甲上的内容流轉至裝置乙,然後修改了裝置甲上的部分參數或檔案,再次從裝置甲向裝置乙發起流轉,裝置甲會重複上述1至3的動作。這不是裝置甲首次将資料遷移至裝置乙,裝置乙上的配套Ability在這一輪的動作1裡,預設狀況并不是StackLayout中的過渡圖層覆寫至最頂層,并且這裡的動作1也是觸發的onNewIntent而非onStart,裝置乙會在這一次動作1裡手動将過渡圖層設定為Visible,然後再執行動作2。

<br>

這樣,我們的HarmonyOS應用,在攜帶較大資料量進行流轉時,使用者也會感覺的更自然,大家都學會了嗎?我們下一期再見啦~

繼續閱讀