1 NativeAbilityFwk框架
对于hi3321芯片的brandy sdk而言,ui的开发是基于NativeAbilityFwk应用框架;
NativeAbilityFwk是基于穿戴产品的特点从鸿蒙原生Native中裁剪定制的轻量级UI;
JSAbility由JavaScript编写;通过ACE注册到AMS中管理,先放着;
NativeAbility由C++编写;通过LauncherAbility注册到AMS中管理;NativeAbility只有一个,可以管理多个Slice的生命周期;
2 添加sliceID
添加slice的时候,首先为待添加页面定义一个id,在NativeAbility中通过ID来管理和切换页面和视图;
//need_add
//AppViewIDs.h
typedef enum : uint16_t {
VIEW_INVALID = 0,
VIEW_MAIN = 1,
//...
VIEW_MAX_INTER_APP,
} AppViewId;
3 添加slice信息
添加slice的时候,需要将slice信息添加到NativeAbility中管理;
3.1 NativeAbilityFwk的入口函数
这部分是程序ui入口执行的逻辑流,不用修改,只是为了结构清晰;
//don't need add;
//NativeAbility.cpp
void NativeAbility::InstallAbility(void){
InstallNativeAbility(nullptr, this);
NativeLauncher::GetInstance().InitNativeLauncher();
return;
}
//NativeLauncher.cpp
void NativeLauncher::InitNativeLauncher() {
GraphicStartUp::InitFontEngine(MEM_POOL_UI_FONT, MEM_POOL_UI_FONT_SIZE,\
OHOS::VECTOR_FONT_DIR, DEFAULT_VECTOR_FONT_FILENAME);
InitBtHeadsetEvent();
//cae:把每个initSlices函数都调用了一遍,把创建的实例和ID对应上
InitAllNativeSlices();
CallerLogModel::GetInstance()->InitPhoneService();
PresenterTask::GetInstance()->Init();
PlayersModel::GetInstance()->AudioInit();
ActivityModel::GetInstance()->Init();
ScreenModels::GetInstance()->InitCardConfig();
VocassistModel::GetInstance()->Init();
HeartModel::GetInstance()->Init();
BluetoothModel::GetInstance()->Init();
ScreenModels::GetInstance()->PreLoadAppimages();
NativeAbility::GetInstance().SetDefaultSliceId(VIEW_MAIN_SAMPLE);
}
void NativeLauncher::InitAllNativeSlices(void){
uint16_t size = sizeof(SLICE_MAPPER) / sizeof(SLICE_MAPPER[0]);
for (int index = 0; index < size; index++) {
if ((SLICE_MAPPER[index].id >= VIEW_MAX_INTER_APP)) continue;
//cae:将SLICE_MAPPER[]中的每个地址以函数指针的形式调用;
( this->*(SLICE_MAPPER[index].func) )();