1. 程式人生 > 實用技巧 >【鴻蒙開發】建立第一個Feature

【鴻蒙開發】建立第一個Feature

目錄:

1. 建立Service變數

2. 建立Feature變數

3. 註冊Service&Feature

4. 新增初始化

原始碼裡是有Feature的示例的,但當自己寫一個自己的Feature時,卻遇到了各種問題,有些是示例程式碼和文件沒有說明的小坑,這裡記錄一下。因原始碼裡的startup目錄沒有任何程式碼,就選擇它來存放程式碼。

BUILD.gn檔案裡的source_set("startup")需要修改成 static_library("startup")。

source_set 應該是不會打包進去還是什麼,程式碼不會被執行,修改成static_library發現bin檔案也增大了一些。
使用SYSEX_FEATURE_INIT(Init);進行初始化即可,可不使用SYS_RUN()和CORE_INI()巨集。
直接使用SAMGR_GetInstance()->RegisterFeature(),並不能啟動Feature。Feature的啟動需要配全Service一塊使用,在使用SAMGR_GetInstance()->RegisterFeature()前需要先SAMGR_GetInstance()->RegisterService()註冊一個同命的Service才行。這點是最坑的地址,註冊Feature時引數是Service名稱字串,所以就很容易想到直接註冊就可以了,結束事實證明這樣是行不通的。
標頭檔案的順序,#include <ohos_init.h>要在#include "hctest.h"之前,否則SYSEX_FEATURE_INIT引用的是hos_init.h裡的宣告,而不是ohos_init.h檔案裡的宣告

下面看一下新增Feature的正確方式:

1. 建立Service變數

static const char *GetName(Service *service);
static BOOL Initialize(Service *service, Identity identity);
static BOOL MessageHandle(Service *service, Request *msg);
static TaskConfig GetTaskConfig(Service *service);
static Service g_exampleService={
    .GetName=GetName,
    .Initialize=Initialize,
    .MessageHandle=MessageHandle,
    .GetTaskConfig=GetTaskConfig
};

2. 建立Feature變數

這裡定義Feature沒有直接使用Feature進行定義,而是使用了原始碼示例中的另一種方式,即同類型定義。

typedef struct DemoApi{
    INHERIT_IUNKNOWN;
    BOOL (*AsyncCall)(IUnknown *iUnknown, const char *buff);
    BOOL (*SyncCall)(IUnknown *iUnknown,struct Payload *payload);
} DemoApi;

typedef struct DemoFeature{
    INHERIT_FEATURE;
    INHERIT_IUNKNOWNENTRY(DemoApi);
    Identity identity;
} DemoFeature;

static BOOL AsyncCall(IUnknown *iUnknown, const char *body);
static BOOL SyncCall(IUnknown *iUnknown, struct Payload *payload);
static const char* FEATURE_GetName(Feature *feature);
static void FEATURE_OnInitialize(Feature *feature, Service* parent, Identity identity);
static void FEATURE_OnStop(Feature *feature, Identity identity);
static BOOL FEATURE_OnMessage(Feature *feature, Request *request);

3. 註冊Service&Feature

SAMGR_GetInstance()->RegisterService(&g_exampleService);
SAMGR_GetInstance()->RegisterFeature(EXAMPLE_SERVICE,(Feature*)&g_example);
SAMGR_GetInstance()->RegisterFeatureApi(EXAMPLE_SERVICE,EXAMPLE_FEATURE,GET_IUNKNOWN(g_example));

4. 新增初始化

SYSEX_FEATURE_INIT(Init);

做完以上步驟後編譯燒寫到wifi-iot開發板後就可以看到Feature能被正常初始化了。當然上面只是貼出了核心程式碼,宣告的方法還是需要再實現一下的,下面是完整的程式碼。

解鎖檢視完整程式碼

作者:mb5f8960971f61a

想了解更多內容,請訪問: 51CTO和華為官方戰略合作共建的鴻蒙技術社群https://harmonyos.51cto.com

【免費直播公開課- 讓鴻蒙智慧家居開發板與AWS IoT雲完美連通 】