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

OpenHarmony-UI框架適配層淺析之一

系統(tǒng) OpenHarmony
本文主要對適配層的部分核心類進(jìn)行簡單介紹,通過這些核心類的關(guān)系圖和流程交互說明來一窺適配層的部分面貌。

??想了解更多內(nèi)容,請訪問:??

??51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)??

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

前言

方舟開發(fā)框架(簡稱:ArkUI),是一套UI開發(fā)框架,提供開發(fā)者進(jìn)行應(yīng)用UI開發(fā)時所必須的能力。提供跨平臺能力,集成了類Web開發(fā)范式與聲明式開發(fā)范式兩種開發(fā)范式??蚣芊譃閼?yīng)用層、框架層、渲染引擎、平臺適配和橋接層。本文主要對適配層的部分核心類進(jìn)行簡單介紹,通過這些核心類的關(guān)系圖和流程交互說明來一窺適配層的部分面貌。

核心類簡介

類關(guān)系圖

  • AceEngine: 全局唯一,提供實例的開門狗注冊、垃圾回收能力,同時也作為AceContainer的容器。
  • AceContainer:顧名思義,是一個容器類,由前端、任務(wù)執(zhí)行器、資源管理器、渲染管線、視圖等聚合而成,提供了生命周期對接、功能調(diào)度接口和UI渲染的各項能力,是平臺適配中非常重要的模塊。
  • AceAbility: 對應(yīng)的是FA模型中的PageAbility,是用戶具體可見并可以交互的Ability實例。
  • Frontend: 前端框架的抽象,由DeclarativeFrontend、JsFrontend和CardFrontend繼承來實現(xiàn)聲明式、類WEB及Card方式的實現(xiàn)。
  • PlatformEventCallback:平臺事件回調(diào)的抽象,不同ability實現(xiàn)各自的回調(diào)接口。目前僅支持OnFinish和OnStatusBarBgColorChanged兩個事件的回調(diào)。
  • AssetManager: 資源管理器的抽象,由FlutterAssetManager實現(xiàn),最終由FileAssetProvider提供資源文件加載。
  • AceView: 渲染生成視圖節(jié)點(diǎn)。
  • TaskExecutor: 任務(wù)管理器。
  • PipelineContext: 渲染管線。
  • PlatformResRegister: 平臺資源的注冊和管理,通過接口回調(diào)實現(xiàn)平臺層的渲染。

協(xié)作說明

這里我們以一個典型的APP窗口尺寸發(fā)生變化的實現(xiàn)流程來幫助大家理解ACE框架類之間是如何交互的,參見時序圖:

步驟說明:

  1. WindowImpl窗口對象感知窗口發(fā)生變化,調(diào)用監(jiān)聽者的OnSizeChange方法。
  2. 根據(jù)ability ID獲取對應(yīng)的AceContainer。
  3. 從AceContainer中獲取TaskExecutor任務(wù)管理器。
  4. 通過任務(wù)管理器創(chuàng)建任務(wù)。
  5. 從AceContainer中獲取當(dāng)前View。
  6. 調(diào)用FlutterAceView::SurfaceChanged處理界面的變化。
  7. FlutterAceView回調(diào)AceContainer注冊的viewChangeCallback方法。
  8. viewChangeCallback從PipelineContext渲染管線對象中獲取TaskExecutor任務(wù)管理器。
  9. 通過任務(wù)管理器創(chuàng)建任務(wù)。
  10. 任務(wù)方法調(diào)用渲染管線PipelineContext::OnSurfaceChanged方法處理。
  11. 渲染管線最終調(diào)用前端框架OnSurfaceChanged處理界面發(fā)生的變化。

關(guān)鍵代碼實現(xiàn):

AceAbility繼承自O(shè)HOS::Rosen::IWindowChangeListener,作為監(jiān)聽者在OnStart啟動的時候向windows對象進(jìn)行了注冊。

void AceAbility::OnStart(const Want& want) {
...
// register surface change callback
OHOS::sptr<OHOS::Rosen::IWindowChangeListener> thisAbility(this);
window->RegisterWindowChangeListener(thisAbility);
...
}

當(dāng)界面發(fā)生變化,WindowImpl::UpdateRect調(diào)用監(jiān)聽者的OnSizeChange處理。

void WindowImpl::UpdateRect(const struct Rect& rect, WindowSizeChangeReason reason)
{
...
for (auto& listener : windowChangeListeners_) {
if (listener != nullptr) {
listener->OnSizeChange(rect, reason);
}
...
}

AceAbility::OnSizeChange()。

void AceAbility::OnSizeChange(OHOS::Rosen::Rect rect, OHOS::Rosen::WindowSizeChangeReason reason)
{
auto container = Platform::AceContainer::GetContainer(abilityId_);
...
auto taskExecutor = container->GetTaskExecutor();
...
taskExecutor->PostTask([rect, abilityId = abilityId_, density = density_, reason]() {
...
auto flutterAceView = static_cast<Platform::FlutterAceView*>(container->GetView());
...
Platform::FlutterAceView::SurfaceChanged(
flutterAceView, width, height, 0, static_cast<WindowSizeChangeReason>(reason));
}, TaskExecutor::TaskType::PLATFORM);
}

Platform::FlutterAceView::SurfaceChanged()。

void FlutterAceView::SurfaceChanged(
FlutterAceView* view, int32_t width, int32_t height, int32_t orientation, WindowSizeChangeReason type)
{
...
view->NotifySurfaceChanged(width, height, type);
auto platformView = view->GetShellHolder()->GetPlatformView();
if (platformView) {
platformView->NotifyChanged(SkISize::Make(width, height));
}
...
}

viewChangeCallback()回調(diào)函數(shù)。

auto&& viewChangeCallback = [context = pipelineContext_, id = instanceId_](
int32_t width, int32_t height, WindowSizeChangeReason type) {
ContainerScope scope(id);
ACE_SCOPED_TRACE("ViewChangeCallback(%d, %d)", width, height);
context->GetTaskExecutor()->PostTask(
[context, width, height, type]() { context->OnSurfaceChanged(width, height, type); },
TaskExecutor::TaskType::UI);
};
aceView_->RegisterViewChangeCallback(viewChangeCallback);

PipelineContext::OnSurfaceChanged()。

void PipelineContext::OnSurfaceChanged(int32_t width, int32_t height, WindowSizeChangeReason type)
{
...
auto frontend = weakFrontend_.Upgrade();
if (frontend) {
frontend->OnSurfaceChanged(width, height);
}
...
}

延伸

OpenHarmony用戶程序的開發(fā)本質(zhì)上就是開發(fā)Ability。OpenHarmony系統(tǒng)是通過對Ability調(diào)度,結(jié)合系統(tǒng)提供的一致性調(diào)度契約對Ability進(jìn)行生命周期管理,從而實現(xiàn)對用戶程序的調(diào)度。

Ability框架在API 8及更早版本使用FA模型。FA模型中Ability分為PageAbility、ServiceAbility、DataAbility、FormAbility幾種類型。其中:

  • PageAbility是具備ArkUI實現(xiàn)的Ability,是用戶具體可見并可以交互的Ability實例。
  • ServiceAbility也是Ability一種,但是沒有UI,提供其他Ability調(diào)用自定義的服務(wù),在后臺運(yùn)行。
  • DataAbility也是沒有UI的Ability,提供其他Ability進(jìn)行數(shù)據(jù)的增刪查服務(wù),在后臺運(yùn)行。
  • FormAbility是卡片Ability,是一種界面展示形式。

AceAbility對應(yīng)的是FA模型中的PageAbility,和AceContainer容器類搭配管理。其它幾種ability在ACE框架中分別對應(yīng)AceDataAbility、AceFormAbility和AceServiceAbility,使用PaContainer容器類進(jìn)行管理,關(guān)系如下圖:

小結(jié)

  1. AceAbility是帶UI界面的Ability,非UI界面的ability是AceDataAbility、AceFormAbility和AceServiceAbility。
  2. AceContainer是一個容器,聚合了前端、渲染管線和任務(wù)執(zhí)行器等核心功能,相當(dāng)于一個大總管,ability的關(guān)鍵流程都要經(jīng)過它調(diào)度。
  3. 通過Frontend、PlatformEventCallback、AssetManager和AceView等抽象類,提供了對平臺的抽象,通過擴(kuò)展實現(xiàn),滿足不同平臺的適配。

參考鏈接

方舟開發(fā)框架概述:

https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/ui/arkui-overview.md。

Ability框架概述:

https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/ability/ability-brief.md。

FA模型綜述:

https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/ability/fa-brief.md。

OpenHarmony 源碼解析之ACE:

https://ost.51cto.com/posts/7908。

??想了解更多內(nèi)容,請訪問:??

??51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)??

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

責(zé)任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2022-02-28 14:54:48

openHarmon鴻蒙操作系統(tǒng)

2023-01-04 15:24:46

ACE組件UI布局

2022-04-01 16:04:33

Harmonytabs容器鴻蒙

2022-05-16 11:50:45

HDF驅(qū)動框架

2022-03-15 15:24:53

操作系統(tǒng)RTOSAT模塊

2013-12-02 13:59:22

jQueryUI

2009-07-20 17:01:11

Struts2.0+i

2014-07-28 16:05:42

云適配

2023-02-07 15:52:50

2010-03-26 09:16:44

2016-10-20 19:27:00

開源項目bootstrapcss框架

2023-06-27 15:12:46

C++三方庫移植

2022-04-01 15:18:04

HarmonyHDF 驅(qū)動鴻蒙

2009-09-22 13:09:06

Hibernateorm框架

2023-02-07 15:43:13

三方庫適配鴻蒙

2009-07-16 09:14:26

iBATIS DAO

2009-09-14 16:46:15

LINQ to XML

2022-03-07 15:22:16

classHarmony鴻蒙

2012-02-20 09:54:35

ibmdw

2022-05-30 15:21:27

Hi3861TCP通信
點(diǎn)贊
收藏

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