成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

OpenHarmony3.1-Ace-Formcomponent源碼解析

系統 OpenHarmony
本文主要介紹了FormComponent控件的關鍵實現機制、主要類關系及重要的處理流程,側重于改控件本身,如果需要更完整的卡片原子服務流程,還需要分析卡片管理者FormMgr。兩者聯系起來學習,才能更清楚的理解完整的流程。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

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

簡介

formcomponent用于展示桌面圖標和卡片。

卡片類似于安卓上的小部件,可以顯示于桌面上或者在一些其他系統服務頁面。

在展示卡片時,使用card_frontend解析hml標記語言,這是與應用展示不同的一種方式。OpenHarmony支持的應用界面開發有js的類web(hml+css+js)和ets兩種聲明式,在展示卡片時單獨使用了這種更輕量的卡片式(也是類web的,hml+css+json)。

圖標和卡片雖然來源和管理者不同,但在使用者這里,并無太大區別。桌面上的app圖標相當于1*1的卡片, 實現點擊跳轉到應用, 沒有動態刷新(allowUpate=false)。 以下分析都以卡片來進行說明。

代碼位置

/foundation/ace/ace_engine/frameworks/
├──bridge
├──card_frontend
├──js_card_parser.h
├──js_card_parser.cpp
├──card_frontend.h
├──card_frontend.cpp
├──card_frontend_delegate.h
└──card_frontend_delegate.cpp
└──declarative_frontend/jsview
├──js_form.h
└──js_form.cpp
└──core
├──common
├──form_manager.h
└──form_manager.cpp
└──components/form
├──resource
├──form_request_data.h
├──form_callback_client.h
├──form_manager_resource.h
├──form_manager_resource.cpp
├──form_manager_delegate.h
└──form_manager_delegate.cpp
├──form_component.cpp
├──form_component.h
├──form_element.cpp
├──form_element.h
├──render_form_creator.cpp
├──render_form.cpp
├──render_form.h
├──rosen_render_form.cpp
├──rosen_render_form.h
├──flutter_render_form.cpp
├──flutter_render_form.h
├──form_window.cpp
├──form_window.h
├──sub_container.cpp
└──sub_container.h

bridge/card_frontend雖然和declarative_frontend、js_frontend位于同一級目錄,但它實際上是給sub_container用的,目前并不是一種開發應用界面的方式。它的作用是解析卡片UI。

bridge/declarative_frontend/jsview下的js_form是將ets中的組件關聯到c++的ace引擎組件實例。

core/components/form下是ace引擎組件form_component。

系統架構

#夏日挑戰賽#OpenHarmony3.1-ace-formcomponent源碼解析-開源基礎軟件社區

圖 1 系統架構

卡片提供者是ace_form_ability。卡片內容是hml+css+json,ace_form_ability負責里面數據的更新。

使用者是ace_ability,顯示卡片先創建ace中組件form_component, 其中的sub_container通過card_frontend來解析前端hml+css+json展示。

一個類比:formmgr相當于服務器,提供者相當于服務器上的服務,使用者相當于客戶端。

form_component能與卡片管理者formmgr通信,將卡片被安裝的事件告知formmgr。formmgr通知卡片提供者啟動ability。

#夏日挑戰賽#OpenHarmony3.1-ace-formcomponent源碼解析-開源基礎軟件社區

圖 2 類圖

關鍵類介紹

  • FormComponentAttribute、JSForm。
    sdk的ts接口以及關聯的c類。它們是將應用里的控件翻譯為c對象。
    前端FormComponent創建時設置的屬性包括:
    id、name、bundle、ability、module、dimension(1*2, 2*2, 2*4, 4*4)、temporary。
interface FormComponentInterface {
(value: {
id: number;
name: string;
bundle: string;
ability: string;
module: string;
dimension?: FormDimension;
temporary?: boolean;
}): FormComponentAttribute;
}

JSForm在Create()中創建FormComponent時,將屬性通過RequestFormInfo傳給FormComponent實例。

設置的回調包括:

onAcquired、onError、onRouter、onUninstall。

  • FormComponent、FormElement、RenderForm[RosenRenderForm、FlutterRenderForm]。
    ace控件三件套,注意RenderForm是繼承于RenderSubContainer。
    FormComponent保存卡片屬性。
    FormElement在Prepare()中設置FormManagerDelegate的回調方法,在update()中創建SubContainer。
    RenderForm中內容很少,因為真正繪制卡片是在SubContainer里面。
  • FormManagerDelegate。
    能夠與pipeline和FormMgr通信。在標準系統中,通過FormMgr管理卡片;[在lite系統中,沒有FormMgr,通過pipeline中的PlatformResRegister管理]。
    FormMgr主動發起的ipc通過FormCallbackClient調用過來。
  • FormManager。
    本地管理SubContainer的單實例。
  • SubContainer。
    真正渲染卡片的地方。
    outSidePipelineContext_是整個FormComponent的pipeline,pipelineContext_則是SubContainer自己渲染卡片時用的pipeline。這兩句代碼可以表明二者的關系:
auto&& window = std::make_unique<FormWindow>(outSidePipelineContext_);
pipelineContext_ = AceType::MakeRefPtr<PipelineContext>(std::move(window), taskExecutor_, assetManager_, nullptr, frontend_, instanceId_);

渲染卡片使用的是CardFrontend。

  • CardFrontend、CardEventHandler、CardFrontendDelegate、JsCardParser

卡片渲染引擎。

流程分析

初始化流程

#夏日挑戰賽#OpenHarmony3.1-ace-formcomponent源碼解析-開源基礎軟件社區

圖 3 初始化時序圖

  1. 首先前端創建FormComponent組件,并設置屬性和回調。
  2. 然后ace框架在vsync事件里創建FormElement和RenderForm。
  3. FormElement初始化創建FormManagerDelegate,并注冊事件回調。
  4. FormElement在update事件中創建SubContainer,然后通過FormManagerDelegate通知卡片管理者。
  • RouterEvent只在lite系統使用,本文檔后面不做分析了。

管理中心發起事件流程

#夏日挑戰賽#OpenHarmony3.1-ace-formcomponent源碼解析-開源基礎軟件社區

圖 4 加載成功時序圖

#夏日挑戰賽#OpenHarmony3.1-ace-formcomponent源碼解析-開源基礎軟件社區

圖 5 數據更新時序圖

  1. 卡片數據更新由管理者回調通知,如果是首次則是Acquire流程,否則是Update流程。
  2. Acquire流程先將事件逐級回調通到應用js中,然后SubContainer調用CardFrontend展示卡片。
  3. Update流程只需要SubContainer調用CardFrontend更新卡片。

#夏日挑戰賽#OpenHarmony3.1-ace-formcomponent源碼解析-開源基礎軟件社區

圖 6 卸載時序圖

卸載事件是通知應用的,應用在回調里可以將FormComponent去掉。

圖 7 提供者ability退出時序圖

#夏日挑戰賽#OpenHarmony3.1-ace-formcomponent源碼解析-開源基礎軟件社區

圖 7 提供者ability退出時序圖

這個事件我的理解是提供者ability掛掉了,但是使用這這里繼續使用,通知管理者重新啟動起來。

交互事件流程

#夏日挑戰賽#OpenHarmony3.1-ace-formcomponent源碼解析-開源基礎軟件社區

圖 8 交互事件時序圖

  1. 卡片加載時,SubContainer在runcard方法中,向pipeline注冊回調。
  2. pipeline響應到事件,回調SubContainer的方法。SubContainer回調FormElement,FormElement通過FormManagerDelegate發送給卡片管理者。
  3. 事件只支持router和message兩種類型。
  4. router事件多一步調用pipeline的OnActionEvent。
  5. 最終提供者ability響應事件。提供者是一個FormExtension的子類ability,在方法onEvent(formId, message)中處理事件。
  • 與其他控件的最大區別就是,UI及UI事件代碼和事件響應代碼在兩個位置,并運行于兩個ability中。

總結

本文主要介紹了FormComponent控件的關鍵實現機制、主要類關系及重要的處理流程,側重于改控件本身,如果需要更完整的卡片原子服務流程,還需要分析卡片管理者FormMgr。兩者聯系起來學習,才能更清楚的理解完整的流程。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

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

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2021-08-30 18:09:57

鴻蒙HarmonyOS應用

2022-05-24 15:46:51

Wi-FiSTA模式

2022-07-27 14:30:15

分布式數據鴻蒙

2022-05-20 10:32:49

事件循環器事件隊列鴻蒙

2022-02-14 14:47:11

SystemUIOpenHarmon鴻蒙

2022-05-17 10:42:36

reboot源碼解析

2022-05-07 16:13:59

DevEcoTool鴻蒙

2022-06-13 14:18:39

電源管理子系統耗電量服務

2021-09-16 15:08:08

鴻蒙HarmonyOS應用

2021-11-25 09:54:54

鴻蒙HarmonyOS應用

2022-02-17 20:57:07

OpenHarmon操作系統鴻蒙

2022-01-06 16:17:58

鴻蒙HarmonyOS應用

2021-12-08 15:07:51

鴻蒙HarmonyOS應用

2021-11-08 15:04:47

鴻蒙HarmonyOS應用

2021-12-17 16:42:09

鴻蒙HarmonyOS應用

2022-07-05 16:03:29

電源管理子系統鴻蒙

2021-09-18 14:40:37

鴻蒙HarmonyOS應用

2022-06-01 22:41:29

轉場動畫鴻蒙

2022-04-25 09:10:50

RK3568鴻蒙

2022-07-06 20:40:27

舒爾特方格鴻蒙
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产午夜精品一区二区三区四区 | 天堂在线www | 一区二区三区不卡视频 | 亚洲精品久久久久久久久久久久久 | 精品1区2区 | 国产精品久久久久久久久久尿 | 亚洲瑟瑟 | 岛国在线免费观看 | 国产精品视频一区二区三区不卡 | 中文字幕一区二区三区四区 | 精品欧美黑人一区二区三区 | 国产日韩久久 | 欧美 视频| 天堂男人av | 国产免费一区二区 | 日本在线网站 | 亚洲精品中文字幕中文字幕 | 亚洲成人精品一区二区 | 精品日本中文字幕 | 国产精品s色| 久久一区二区三区四区五区 | 97伦理电影 | 久久久精品一区二区三区 | 久草视频在线播放 | 亚洲国产一区在线 | 国产精品欧美一区二区三区 | 男女爱爱网站 | 久久亚洲综合 | 亚洲欧美综合 | av在线播放网址 | 亚洲一区二区精品视频 | 国产婷婷综合 | 久操av在线 | 国产精品1区2区 | 成人午夜高清 | 狠狠婷婷综合久久久久久妖精 | av网站在线免费观看 | 日韩在线播放一区 | 中文字幕视频在线观看免费 | 国产一区不卡 | 成人午夜免费视频 |