0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

NAPI 類對象導(dǎo)出及其生命周期管理(下)

OpenHarmony開發(fā)經(jīng)驗(yàn) ? 來源:OpenHarmony開發(fā)經(jīng)驗(yàn) ? 作者:OpenHarmony開發(fā)經(jīng)驗(yàn) ? 2023-05-16 10:25 ? 次閱讀

往期回顧:NAPI 類對象導(dǎo)出及其生命周期管理(上)

4. 樣例工程源碼剖析

  • 工程的模板是Native C++,模型是Stage

  • 源碼剖析主要圍繞以下幾個(gè)文件

    image.png

4.1. NAPI導(dǎo)出對象和生命周期管理具體實(shí)現(xiàn)

4.1.1. 定義NapiTest類及方法

  • Napi.h文件內(nèi)容如下:
#ifndef __NAPI_TEST_H__
#define __NAPI_TEST_H__

#include "napi/native_api.h"
#include 

#include 

#define NAPI_CLASS_NAME "NapiTestClass"

class NapiTest {
public:
  NapiTest() : mEnv(nullptr), mRef(nullptr) {
  }
    
  NapiTest(napi_env env) : mEnv(env), mRef(nullptr){
  }
  ~NapiTest();
    
    // 創(chuàng)建NapiTest類的實(shí)體,并將實(shí)體返回到應(yīng)用端,該方法為js創(chuàng)建一個(gè)類實(shí)體,因此需要將該接口對外導(dǎo)出
  static napi_value Create(napi_env env, napi_callback_info info);
    
    // 初始化js類并設(shè)置對應(yīng)屬性并將其導(dǎo)出   
  static napi_value Init(napi_env env, napi_value exports);         


private:
    
    // 設(shè)置數(shù)據(jù),此方法給到j(luò)s直接調(diào)用,因此需要將該接口對外導(dǎo)出
	static napi_value SetMsg(napi_env env, napi_callback_info info);
    
    // 獲取數(shù)據(jù),此方法給到j(luò)s直接調(diào)用,因此需要將該接口對外導(dǎo)出    
    static napi_value GetMsg(napi_env env, napi_callback_info info);
    
    // 定義js結(jié)構(gòu)體時(shí)實(shí)際的構(gòu)建函數(shù)
    static napi_value Constructor(napi_env env, napi_callback_info info);     

    // 釋放資源的函數(shù)(類似類的析構(gòu)函數(shù))    
    static void Destructor(napi_env env, void *nativeObject, void *finalize); 

    // 生命周期變量    
    static napi_ref sConstructor_;  

    // 設(shè)置和獲取數(shù)據(jù)的變量    
    static std::string _msg;        

    // 記錄環(huán)境變量    
    napi_env mEnv = nullptr;        

    // 記錄生命周期變量    
    napi_ref mRef = nullptr;        

};

#endif  /* __NAPI_TEST_H__ */

4.1.1.1 napi_value

  • Node.js Node-API的值用napi_value類型表示。

    OpenHarmony NAPI將ECMAScript標(biāo)準(zhǔn)中定義的Boolean、Null、Undefined、Number、BigInt、String、Symbol和Object八種數(shù)據(jù)類型,以及函數(shù)對應(yīng)的Function類型,統(tǒng)一封裝成napi_value類型,下文中表述為JS類型,用于接收ArkUI應(yīng)用傳遞過來的數(shù)據(jù)及返回?cái)?shù)據(jù)給ArkUI應(yīng)用。

  • 這是一個(gè)不透明的指針,用于表示JavaScript值。

4.1.1.2 napi_ref

  • 這是用來引用napi_value的抽象。這允許用戶管理JavaScript值的生命周期,包括顯式地定義它們的最小生命周期。

    https://nodejs.org/docs/latest-v14.x/api/n-api.html#n_api_napi_ref

4.1.1.3 napi_env

  • napi_env用于表示上下文,底層的Node-API實(shí)現(xiàn)可以使用該上下文持久保持VM-specific的狀態(tài)。

    https://nodejs.org/docs/latest-v14.x/api/n-api.html#n_api_napi_env

4.1.2 將NapiTest類定義為js類

4.1.2.1在定義js類之前,需要先設(shè)置js類對外導(dǎo)出的方法

// 在定義js類之前,需要先設(shè)置類對外導(dǎo)出的方法
    napi_property_descriptor desc[] = {
        { "getMsg", nullptr, NapiTest::GetMsg, nullptr, nullptr, nullptr, napi_default, nullptr },
        { "setMsg", nullptr, NapiTest::SetMsg, nullptr, nullptr, nullptr, napi_default, nullptr },
        { "create", nullptr, NapiTest::Create, nullptr, nullptr, nullptr, napi_default, nullptr }
    };
4.1.2.1.1 napi_property_descriptor

參考 https://nodejs.org/docs/latest-v14.x/api/n-api.html#n_api_napi_property_descriptor

Node.js Node-API有一組API來獲取和設(shè)置JavaScript對象的屬性。在JavaScript中,屬性被表示為一個(gè)鍵和一個(gè)值的元組。基本上,Node-API中的所有屬性鍵都可以用以下形式中的任一一種表示:

  • Named:一個(gè)簡單的UTF-8編碼的字符串
  • Integer-Indexed:索引值,由uint32_t表示
  • JavaScript value:在Node-API中通過napi_value表示。它可以是一個(gè)napi_value,表示字符串、數(shù)字或符號(hào)。
typedef struct {
  // utf8name和name其中一個(gè)必須是NULL
  const char* utf8name;
  napi_value name;

  napi_callback method;
  napi_callback getter;
  napi_callback setter;
  napi_value value;

  napi_property_attributes attributes;
  void* data;
} napi_property_descriptor;

參數(shù)解析:

  • utf8name:在定義js類之前設(shè)置的js類對外導(dǎo)出的方法名字,編碼為UTF8。必須為該屬性提供utf8name或name中的一個(gè)。(utf8name和name其中一個(gè)必須是NULL)
  • name:可選的napi_value,指向一個(gè)JavaScript字符串或符號(hào),用作屬性的鍵。必須為該屬性提供utf8name或name中的一個(gè)。
  • method:將屬性描述符對象的value屬性設(shè)置為method表示的JavaScript函數(shù)。如果傳入這個(gè)參數(shù),將value、getter和setter設(shè)置為NULL(因?yàn)檫@些成員不會(huì)被使用)。
  • attributes:與特定屬性相關(guān)聯(lián)的屬性。
  • data:調(diào)用函數(shù)時(shí)傳遞給method、getter和setter的callback data。

4.1.2.2 定義與C++類相對應(yīng)的JavaScript類

napi_value constructor = nullptr;

    // 定義與C++類相對應(yīng)的JavaScript類
    if (napi_define_class(env, NAPI_CLASS_NAME, NAPI_AUTO_LENGTH, Constructor, nullptr, sizeof(desc) / sizeof(desc[0]),
                          desc, &constructor) != napi_ok) {
        // "!="用來檢查兩個(gè)操作數(shù)的值是否相等,如果不相等則條件為真
        return nullptr;
    }
4.1.2.2.1 napi_define_class

napi_define_class函數(shù)說明:

https://nodejs.org/docs/latest-v14.x/api/n-api.html#n_api_napi_define_class

napi_status napi_define_class(napi_env env,
                          const char* utf8name,
                          size_t length,
                          napi_callback constructor,
                          void* data,
                          size_t property_count,
                          const napi_property_descriptor* properties,
                          napi_value* result);

功能:定義與C ++ 類相對應(yīng)的JavaScript類。

參數(shù)說明:

  • [in] env: 調(diào)用api的環(huán)境

  • [in] utf8name: C ++ 類的名稱

  • [in] length: C ++ 類的名稱的長度,默認(rèn)自動(dòng)長度使用NAPI_AUTO_LENGTH

  • [in] constructor: 處理C ++ 類實(shí)例構(gòu)造的回調(diào)函數(shù) (因?yàn)镃onstructor函數(shù)被napi_define_class調(diào)用了)。在導(dǎo)出C ++ 類對象時(shí),這個(gè)函數(shù)必須是帶有napi_callback簽名(Constructor函數(shù)有napi_callback簽名是指要滿足typedef napi_value (*napi_callback)(napi_env, napi_callback_info);的形式)的靜態(tài)成員。不能使用c ++ 的類構(gòu)造函數(shù)。

  • [in] data: 作為回調(diào)信息的數(shù)據(jù)屬性傳遞給構(gòu)造函數(shù)回調(diào)的可選數(shù)據(jù)

  • [in] property_count: 屬性數(shù)組中參數(shù)的個(gè)數(shù)

  • [in] properties: 屬性數(shù)組,具體看代碼中napi_property_descriptor部分

  • [out] result: 通過類構(gòu)造函數(shù)綁定類實(shí)例的napi_value對象

    返回:如果API調(diào)用成功返回napi_ok。

JS構(gòu)造函數(shù)

如果一個(gè)js函數(shù)被使用new操作符來調(diào)用了,那么這個(gè)函數(shù)就稱之為js構(gòu)造函數(shù)

C++類回調(diào)函數(shù)

我們調(diào)用別人的API叫call,調(diào)用的第三方API調(diào)用我們的函數(shù)叫回調(diào)(callback)

image.png

4.1.2.3 實(shí)現(xiàn)js類的構(gòu)造函數(shù)

當(dāng)ArkTS應(yīng)用在js端通過new方法獲取類對象的時(shí)候,此時(shí)會(huì)調(diào)用 napi_define_class 中設(shè)置的 constructor 回調(diào)函數(shù),該函數(shù)實(shí)現(xiàn)方法如下:

napi_value NapiTest::Constructor(napi_env env, napi_callback_info info)
{
    napi_value undefineVar = nullptr, thisVar = nullptr;
    napi_get_undefined(env, &undefineVar);

    // 獲取傳入的參數(shù)對象,對象不為空,根據(jù)該參數(shù)創(chuàng)建實(shí)例并并綁定到該對象
    if (napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr) == napi_ok && thisVar != nullptr) {

        // 創(chuàng)建NapiTest 實(shí)例
        NapiTest *reference = new NapiTest(env);

        // 綁定實(shí)例到對象并獲取對象的生命周期
        if (napi_wrap(env, thisVar, reinterpret_cast<void *>(reference), NapiTest::Destructor, nullptr, &(reference->mRef)) == napi_ok) {
            return thisVar;
        }

        return thisVar;
    }
    
    return undefineVar;
}

void NapiTest::Destructor(napi_env env, void *nativeObject, void *finalize)
{
    // 釋放資源
    NapiTest *test = reinterpret_cast
  • NapiTest::Destructo方法是用來釋放創(chuàng)建的對象:
void NapiTest::Destructor(napi_env env, void *nativeObject, void *finalize)
{
    // 類析構(gòu)函數(shù),釋放資源
    NapiTest *test = reinterpret_cast
4.1.2.3.1 napi_wrap
napi_status napi_wrap(napi_env env,
                  napi_value js_object,
                  void* native_object,
                  napi_finalize finalize_cb,
                  void* finalize_hint,
                  napi_ref* result);

功能:將C++類實(shí)例綁定到j(luò)s對象,并關(guān)聯(lián)對應(yīng)的生命周期

參數(shù)說明:

  • [in] env: 調(diào)用api的環(huán)境
  • [in] js_object: 綁定native_object的js對象
  • [in] native_object: C++類實(shí)例對象
  • [in] finalize_cb: 釋放實(shí)例對象的回調(diào)函數(shù)
  • [in] finalize_hint: 傳遞給回調(diào)函數(shù)的數(shù)據(jù)
  • [out] result: 綁定js對象的引用

返回:調(diào)用成功返回0,失敗返回其他

4.1.2.3.2 napi_get_cb_info

NAPI提供了napi_get_cb_info()方法可從napi_callback_info中獲取參數(shù)列表、this及其他數(shù)據(jù)。這個(gè)方法在constructor回調(diào)函數(shù)中使用,從給定的回調(diào)信息中檢索有關(guān)調(diào)用的詳細(xì)信息,如參數(shù)和This指針。

napi_status napi_get_cb_info(napi_env env,              
                             napi_callback_info cbinfo, 
                             size_t* argc,                          
                             napi_value* argv,     
                             napi_value* this_arg, 
                             void** data)

參數(shù)說明:

  • [in] env: 傳入接口調(diào)用者的環(huán)境,包含js引擎等,由框架提供,默認(rèn)情況下直接傳入即可
  • [in] cbinfo: napi_callback_info對象,上下文的信息
  • [in-out] argc: argv數(shù)組的長度。若napi_callback_info中實(shí)際包含的參數(shù)的個(gè)數(shù)大于請求的數(shù)量argc,將只復(fù)制argc的值所指定數(shù)量的參數(shù)只argv中。若實(shí)際的參數(shù)個(gè)數(shù)小于請求的數(shù)量,將復(fù)制全部的參數(shù),數(shù)組多余的空間用空值填充,并將參數(shù)實(shí)際長度寫入argc。
  • [out] argv: 用于接收參數(shù)列表
  • [out] this_arg: 用于接收this對象
  • [out] data: NAPI的上下文數(shù)據(jù) 返回值:返回napi_ok表示轉(zhuǎn)換成功,其他值失敗。下面的返回napi_status方法一樣。

4.1.3 導(dǎo)出js類

// 創(chuàng)建生命周期,初始引用計(jì)數(shù)設(shè)為1
    if (napi_create_reference(env, constructor, 1, &sConstructor_) != napi_ok) {
        return nullptr;
    }

    // 設(shè)置NapiTest對象相關(guān)屬性并綁定到導(dǎo)出變量exports
    if (napi_set_named_property(env, exports, NAPI_CLASS_NAME, constructor) != napi_ok) {
        return nullptr;
    }

4.1.3.1 在設(shè)置js類導(dǎo)出前,需要先創(chuàng)建生命周期

if (napi_create_reference(env, constructor , 1, &sConstructor_) != napi_ok) {
    return nullptr;
}
  • constructor 定義js類時(shí)返回的代表類的構(gòu)造函數(shù)的數(shù)據(jù)
  • sConstructor_ 生命周期變量
4.1.3.1.1 napi_create_reference

napi_create_reference為對象創(chuàng)建一個(gè)reference,以延長其生命周期。調(diào)用者需要自己管理reference生命周期。

napi_create_reference函數(shù)說明:

NAPI_EXTERN napi_status napi_create_reference(napi_env env,
                                              napi_value value,
                                              uint32_t initial_refcount,
                                              napi_ref* result);

功能:通過引用對象創(chuàng)建新的生命周期引用對象

  • [in] env: 調(diào)用 API 的環(huán)境

  • [in] value: napi_value表示我們要引用的對象

  • [in] initial_refcount: 生命周期變量的初始引用計(jì)數(shù)

  • [out] result: 新建的生命周期引用對象

    返回 napi_ok 這個(gè)API就是成功的.

4.1.3.2 將生命周期變量作為導(dǎo)出對象的傳入屬性,并將js類導(dǎo)出到exports中

//  設(shè)置constructor對象相關(guān)屬性并綁定到導(dǎo)出變量exports
if (napi_set_named_property(env, exports, NAPI_CLASS_NAME, constructor) !=  napi_ok) {
    return nullptr;
}
4.1.3.2.1 napi_set_named_property

為給定對象的屬性設(shè)置一個(gè)名稱。

napi_status napi_set_named_property(napi_env env,
                                    napi_value object,
                                    const char* utf8Name,
                                    napi_value value);
  • [in] env: 調(diào)用API的環(huán)境

  • [in] object: NapiTest對象相關(guān)屬性要綁定的屬性值

  • [in] utf8Name: js類的名稱

  • [in] value: 要引用的對象

    返回 napi_ok 則這個(gè)API是成功的

4.1.3.3 設(shè)置導(dǎo)出對象的屬性

hello.cpp中

napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
4.1.3.3.1 napi_define_properties

https://nodejs.org/docs/latest-v14.x/api/n-api.html#n_api_napi_define_properties

napi_status napi_define_properties(napi_env env,
                                   napi_value object,
                                   size_t property_count,
                                   const napi_property_descriptor* properties);

作用:批量的向給定Object中定義屬性

  • [in] env: 調(diào)用api的環(huán)境
  • [in] object: js對象相關(guān)屬性的導(dǎo)出變量
  • [in] property_count: 屬性數(shù)組中的元素?cái)?shù)
  • [in] properties: 屬性數(shù)組

4.1.4 創(chuàng)建類的實(shí)例對象

  • ArkTS應(yīng)用除了調(diào)用new方法獲取類的實(shí)例外,我們也可以提供一些方法讓ArkTS應(yīng)用獲取對應(yīng)的類的實(shí)例,如在我們的NapiTest類中,定義了一個(gè)Create方法,該方法實(shí)現(xiàn)了NapiTest類實(shí)例的獲取。具體實(shí)現(xiàn)如下:
napi_value NapiTest::Create(napi_env env, napi_callback_info info) {
    napi_status status;
    napi_value constructor = nullptr, result = nullptr;
    // 獲取生命周期變量
    status = napi_get_reference_value(env, sConstructor_, &constructor);

    // 創(chuàng)建生命周期內(nèi)的實(shí)例對象并將其返回
    status = napi_new_instance(env, constructor, 0, nullptr, &result);
    auto napiTest = new NapiTest();
    // 綁定實(shí)例類創(chuàng)建NapiTest到導(dǎo)出的對象result
    if (napi_wrap(env, result, reinterpret_cast<void *>(napiTest), Destructor,
    	nullptr, &(napiTest->mRef)) == napi_ok) {
        return result;
    }
    
    return nullptr;
}
  • 在napi接口的注冊中將該方法以接口的方式導(dǎo)出,應(yīng)用層就可以直接調(diào)用該接口并獲取到該類的實(shí)例對。

    特別說明:如果單獨(dú)實(shí)現(xiàn)了一個(gè)類實(shí)例獲取的方法,那么js的類構(gòu)造函數(shù)可以不實(shí)現(xiàn)(也就是定義js結(jié)構(gòu)體時(shí)實(shí)際的構(gòu)建函數(shù)Constructor及釋放資源的函數(shù)Destructor的代碼夠可以不寫)

4.1.4.1 napi_get_reference_value

https://nodejs.org/docs/latest-v14.x/api/n-api.html#n_api_napi_get_reference_value

函數(shù)說明:

NAPI_EXTERN napi_status napi_get_reference_value(napi_env env,
                                                 napi_ref ref,
                                                 napi_value* result);
  • 作用:獲取與reference相關(guān)聯(lián)的js對象
  • [in] env: 調(diào)用API的環(huán)境
  • [in] ref: 生命周期管理的變量
  • [out] result: 對象引用的reference.

4.1.4.2 napi_new_instance

https://nodejs.org/docs/latest-v14.x/api/n-api.html#n_api_napi_new_instance

napi_status napi_new_instance(napi_env env,
                              napi_value cons,
                              size_t argc,
                              napi_value* argv,
                              napi_value* result)
  • 作用:通過給定的構(gòu)造函數(shù),構(gòu)建一個(gè)對象
  • [in] env: 調(diào)用API的環(huán)境
  • [in] cons: napi_value表示要作為構(gòu)造函數(shù)調(diào)用的 JavaScript 函數(shù)
  • [in] argc: argv 數(shù)組中的元素計(jì)數(shù)
  • [in] argv: JavaScript 值數(shù)組,表示構(gòu)造函數(shù)的參數(shù)napi_value。
  • [out] result: napi_value表示返回的 JavaScript 對象

4.2 index.d.ts聲明文件編寫

使用NAPI框架代碼生成工具,可以根據(jù).h生成.d.ts

https://gitee.com/openharmony/napi_generator/blob/master/docs/INSTRUCTION_ZH.md

export const create : () => NapiTest;
export class  NapiTest {
    setMsg(msg: string): void;
    getMsg(): string;
}

也可以寫成

export class  NapiTest {
    create();
    setMsg(msg: string): void;
    getMsg(): string;
}

4.3 CMakeLists.txt文件

# the minimum version of CMake.
cmake_minimum_required(VERSION 3.4.1)
project(ObjectWrapTest)

set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})

# 頭文件路徑
include_directories(${NATIVERENDER_ROOT_PATH}
                    ${NATIVERENDER_ROOT_PATH}/include)
# 動(dòng)態(tài)庫源文件
add_library(entry SHARED hello.cpp NapiTest.cpp)
# 依賴libace_napi.z.so動(dòng)態(tài)庫
target_link_libraries(entry PUBLIC libace_napi.z.so )

4.4 index.ets文件

// 讓IDE不檢查文件語法
// @ts-nocheck 
import testNapi from "libentry.so";

@Entry
@Component

struct Index {
  @State message: string = '導(dǎo)出對象'
  @State nativePointer:number = 0

// 創(chuàng)建對象tt
  tt = testNapi.create();

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            console.info("[NapiTest] Test NAPI 2 + 3 = " + testNapi.add(2, 3));
            try{
              if (this.nativePointer == 0) {
                // log打印,在程序中添加 log
                console.info("[NapiTest] Test NAPI add(2, 3) 1");
                this.nativePointer = testNapi.add(2, 3)
                console.info("[NapiTest] Test NAPI add(2, 3) 2");

                this.tt.setMsg("2+3")
                console.info("[NapiTest] Test NAPI add(2, 3) 3");

              } else {

                console.info("[NapiTest] Test NAPI add(0, 0) 1");

                this.nativePointer = testNapi.add(0, 0)
                console.info("[NapiTest] Test NAPI add(0, 0) 2");

                this.tt.setMsg("4+5")
                console.info("[NapiTest] Test NAPI add(0, 0) 3");
              }
            } catch(e) {
              console.info("[NapiTest]Test NAPI error" + JSON.stringify(e));
            }
            console.info("[NapiTest]Test NAPI " + this.tt.getMsg() + " = " + this.nativePointer);
          })
      }
      .width('100%')
    }
    .height('100%')
  }

}

知識(shí)點(diǎn)附送

napi接口名稱

https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/native-lib/third_party_napi/napi.md

NAPI框架api調(diào)用值得借鑒的示例工程

https://gitee.com/jiangtao92/node-api-test-case

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 源碼
    +關(guān)注

    關(guān)注

    8

    文章

    629

    瀏覽量

    29074
  • 類對象
    +關(guān)注

    關(guān)注

    0

    文章

    3

    瀏覽量

    1444
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3607

    瀏覽量

    15956
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于Rust語言中的生命周期

    Rust是一門系統(tǒng)級(jí)編程語言具備高效、安和并發(fā)等特,而生命周期是這門語言中比較重要的概念之一。在這篇教程中,我們會(huì)了解什么是命周期、為什么需要生命周期、如何使用生命周期,同時(shí)我們依然會(huì)
    的頭像 發(fā)表于 09-19 17:03 ?829次閱讀

    AutoScaling 生命周期掛鉤功能

    摘要: AutoScaling 伸縮組實(shí)例管理功能全面升級(jí),新上線生命周期掛鉤(LifecycleHook)功能,方便用戶更加靈活地管理伸縮組內(nèi)實(shí)例。使用生命周期掛鉤可以在伸縮組發(fā)生伸
    發(fā)表于 06-27 17:13

    理解數(shù)據(jù)生命周期管理思路

    數(shù)據(jù)生命周期管理的思考
    發(fā)表于 03-17 10:49

    HarmonyOS應(yīng)用開發(fā)-PageAbility生命周期

    pageAbility的生命周期如下圖所示:在代碼中通過調(diào)用下列方法實(shí)現(xiàn)生命周期操作:onShow() :Ability由后臺(tái)不可見狀態(tài)切換到前臺(tái)可見狀態(tài)調(diào)用onShow方法,此時(shí)用戶在屏幕可以看到
    發(fā)表于 10-17 11:11

    觸覺智能RK3568使用體驗(yàn)—NAPI 對象導(dǎo)出及其生命周期管理(上)

    本篇知識(shí)點(diǎn),下半部分將對源碼進(jìn)行解析。通過本文您將熟悉:NAPI 導(dǎo)出對象NAPI 對象生命周期
    發(fā)表于 02-08 17:10

    在S32G2 RM中有“生命周期”,生命周期的完整含義是什么?

    在S32G2 RM中,有“生命周期”。生命周期的完整含義是什么,我們應(yīng)該如何使用它?
    發(fā)表于 04-23 10:37

    物聯(lián)網(wǎng)將會(huì)對產(chǎn)品生命周期管理產(chǎn)生哪些影響

    根據(jù)研究,到2020年,連網(wǎng)設(shè)備的數(shù)量預(yù)計(jì)將達(dá)到750億臺(tái)。在許多方面,物聯(lián)網(wǎng)還將通過其積極的“多米諾骨牌效應(yīng)”從根本上影響產(chǎn)品生命周期管理,這將有助于在產(chǎn)品的整個(gè)生命周期內(nèi)提高產(chǎn)品的有效性。
    發(fā)表于 03-13 08:47 ?807次閱讀

    存儲(chǔ)&作用域&生命周期&鏈接屬性

    目錄前言一、存儲(chǔ)&作用域&生命周期&鏈接屬性的概念解析二、linuxC程序 的內(nèi)存映像三、存儲(chǔ)相關(guān)的關(guān)鍵字四、作用域詳解五、變量的
    發(fā)表于 12-09 15:51 ?5次下載
    存儲(chǔ)<b class='flag-5'>類</b>&作用域&<b class='flag-5'>生命周期</b>&鏈接屬性

    Synopsys 啟動(dòng)硅生命周期管理計(jì)劃

    Synopsis 的數(shù)據(jù)分析驅(qū)動(dòng)的硅生命周期管理計(jì)劃解決了 IC 生命周期中的質(zhì)量、可靠性和安全挑戰(zhàn)。
    發(fā)表于 08-18 15:37 ?790次閱讀
    Synopsys 啟動(dòng)硅<b class='flag-5'>生命周期</b><b class='flag-5'>管理</b>計(jì)劃

    Elasticsearch索引生命周期常見的階段

    在 Elastic Stack 6.6 版本后推出了新功能 Index Lifecycle Management(索引生命周期管理),支持針對索引的全生命周期托管管理,并且在 Kiba
    的頭像 發(fā)表于 10-13 10:38 ?1167次閱讀

    生命周期管理:COTS視角

    全面的生命周期管理策略是保護(hù)程序和緩解與長期任務(wù)關(guān)鍵型系統(tǒng)中部署的 COTS 技術(shù)相關(guān)的挑戰(zhàn)的關(guān)鍵。除了降低風(fēng)險(xiǎn)外,生命周期管理服務(wù)還通過確保及時(shí)購買和儲(chǔ)存報(bào)廢 (EOL) 組件并大大
    的頭像 發(fā)表于 11-08 14:18 ?1010次閱讀
    <b class='flag-5'>生命周期</b><b class='flag-5'>管理</b>:COTS視角

    Vue入門Vue的生命周期

    .生命周期 4.1生命周期是什么 Vue的生命周期, 就是Vue實(shí)例從創(chuàng)建到銷毀的過程.
    的頭像 發(fā)表于 02-06 16:16 ?806次閱讀
    Vue入門Vue的<b class='flag-5'>生命周期</b>

    觸覺智能RK3568使用體驗(yàn):NAPI 對象導(dǎo)出及其生命周期管理(上)

    寫在開頭: OpenHarmony 中的 ?N-API組件定義了由ArkTS (JS/ETS)語言編寫的代碼和 native 代碼(使用 C/C++ 編寫)交互的方式,由 Node.js Node-API 框架擴(kuò)展而來。 什么是Node.js Node-API 框架 Node.js Node-API為開發(fā)者提供了一套C/C++ API用于開發(fā)Node.js的Native擴(kuò)展模塊。從Node.js 8.0.0開始,Node-API以實(shí)驗(yàn)性特性作為Node.js本身的一部分被引入,并且從Node.js 10.0.0開始正式全面支持Node-API。 本文以O(shè)penHarmony 3.2beta3源碼中的node.js三方庫為例,從third_party/node/README.OpenSource中可得知3.2bet
    的頭像 發(fā)表于 02-17 09:10 ?819次閱讀

    從設(shè)計(jì)到部署:芯片生命周期管理如何優(yōu)化整個(gè)IC生命周期

    SLM涉及半導(dǎo)體生態(tài)系統(tǒng)的所有階段。它旨在收集有關(guān)芯片及其操作的大量數(shù)據(jù),并使用復(fù)雜的分析來優(yōu)化芯片及其整個(gè)生命周期部署系統(tǒng)的性能、安全性和效率。該技術(shù)可用于提高設(shè)計(jì)魯棒性、減少設(shè)計(jì)裕量、提高電源
    的頭像 發(fā)表于 05-24 18:03 ?2379次閱讀

    什么是設(shè)備全生命周期管理系統(tǒng)?

    設(shè)備全生命周期管理系統(tǒng)是一款能夠?qū)υO(shè)備進(jìn)行全周期數(shù)字化管理的軟件平臺(tái),它通過將設(shè)備信息電子化,使得設(shè)備的管理和監(jiān)督更加便捷。這個(gè)系統(tǒng)不僅涵蓋
    的頭像 發(fā)表于 02-26 14:21 ?1016次閱讀
    什么是設(shè)備全<b class='flag-5'>生命周期</b><b class='flag-5'>管理</b>系統(tǒng)?