1e41f4b71Sopenharmony_ci# Transient Task (C/C++) 2e41f4b71Sopenharmony_ci 3e41f4b71Sopenharmony_ci## When to Use 4e41f4b71Sopenharmony_ci 5e41f4b71Sopenharmony_ciAn application is suspended after it runs in the background for a short period of time. If the application needs to execute a short-time task in the background, for example, saving the status, it can request a transient task to extend the running time in the background. 6e41f4b71Sopenharmony_ci 7e41f4b71Sopenharmony_ci## Available APIs 8e41f4b71Sopenharmony_ci 9e41f4b71Sopenharmony_ciThe following table lists the common APIs. 10e41f4b71Sopenharmony_ci 11e41f4b71Sopenharmony_ci 12e41f4b71Sopenharmony_ci| Name| Description| 13e41f4b71Sopenharmony_ci| -------- | -------- | 14e41f4b71Sopenharmony_ci| int32_t OH_BackgroundTaskManager_RequestSuspendDelay(const char *reason, TransientTask_Callback callback, TransientTask_DelaySuspendInfo *info); | Requests a transient task.| 15e41f4b71Sopenharmony_ci| int32_t OH_BackgroundTaskManager_GetRemainingDelayTime(int32_t requestId, int32_t *delayTime); | Obtains the remaining time of a transient task.| 16e41f4b71Sopenharmony_ci| int32_t OH_BackgroundTaskManager_CancelSuspendDelay(int32_t requestId); | Cancels a transient task.| 17e41f4b71Sopenharmony_ci 18e41f4b71Sopenharmony_ci## How to Develop 19e41f4b71Sopenharmony_ci 20e41f4b71Sopenharmony_ci### Encapsulating the Functions and Registering Modules in the napi_init.cpp File 21e41f4b71Sopenharmony_ci 22e41f4b71Sopenharmony_ci1. Encapsulate the functions. 23e41f4b71Sopenharmony_ci 24e41f4b71Sopenharmony_ci ```C 25e41f4b71Sopenharmony_ci #include "napi/native_api.h" 26e41f4b71Sopenharmony_ci #include "transient_task/transient_task_api.h" 27e41f4b71Sopenharmony_ci 28e41f4b71Sopenharmony_ci TransientTask_DelaySuspendInfo delaySuspendInfo; 29e41f4b71Sopenharmony_ci 30e41f4b71Sopenharmony_ci static void callback(void) 31e41f4b71Sopenharmony_ci { 32e41f4b71Sopenharmony_ci // The transient task is about to end. The service cancels the transient task here. 33e41f4b71Sopenharmony_ci OH_BackgroundTaskManager_CancelSuspendDelay(delaySuspendInfo.requestId); 34e41f4b71Sopenharmony_ci } 35e41f4b71Sopenharmony_ci 36e41f4b71Sopenharmony_ci // Request a transient task. 37e41f4b71Sopenharmony_ci static napi_value RequestSuspendDelay(napi_env env, napi_callback_info info) 38e41f4b71Sopenharmony_ci { 39e41f4b71Sopenharmony_ci napi_value result; 40e41f4b71Sopenharmony_ci int32_t res = OH_BackgroundTaskManager_RequestSuspendDelay("test", callback, &delaySuspendInfo); 41e41f4b71Sopenharmony_ci if (res == 0) { 42e41f4b71Sopenharmony_ci napi_create_int32(env, delaySuspendInfo.requestId, &result); 43e41f4b71Sopenharmony_ci } else { 44e41f4b71Sopenharmony_ci napi_create_int32(env, -1, &result); 45e41f4b71Sopenharmony_ci } 46e41f4b71Sopenharmony_ci return result; 47e41f4b71Sopenharmony_ci } 48e41f4b71Sopenharmony_ci 49e41f4b71Sopenharmony_ci // Obtain the remaining time. 50e41f4b71Sopenharmony_ci static napi_value GetRemainingDelayTime(napi_env env, napi_callback_info info) 51e41f4b71Sopenharmony_ci { 52e41f4b71Sopenharmony_ci napi_value result; 53e41f4b71Sopenharmony_ci int32_t delayTime = 0; 54e41f4b71Sopenharmony_ci int32_t res = OH_BackgroundTaskManager_GetRemainingDelayTime(delaySuspendInfo.requestId, &delayTime); 55e41f4b71Sopenharmony_ci if (res == 0) { 56e41f4b71Sopenharmony_ci napi_create_int32(env, delayTime, &result); 57e41f4b71Sopenharmony_ci } else { 58e41f4b71Sopenharmony_ci napi_create_int32(env, -1, &result); 59e41f4b71Sopenharmony_ci } 60e41f4b71Sopenharmony_ci return result; 61e41f4b71Sopenharmony_ci } 62e41f4b71Sopenharmony_ci 63e41f4b71Sopenharmony_ci // Cancel the transient task. 64e41f4b71Sopenharmony_ci static napi_value CancelSuspendDelay(napi_env env, napi_callback_info info) 65e41f4b71Sopenharmony_ci { 66e41f4b71Sopenharmony_ci napi_value result; 67e41f4b71Sopenharmony_ci int32_t res = OH_BackgroundTaskManager_CancelSuspendDelay(delaySuspendInfo.requestId); 68e41f4b71Sopenharmony_ci napi_create_int32(env, res, &result); 69e41f4b71Sopenharmony_ci return result; 70e41f4b71Sopenharmony_ci } 71e41f4b71Sopenharmony_ci 72e41f4b71Sopenharmony_ci ``` 73e41f4b71Sopenharmony_ci 74e41f4b71Sopenharmony_ci2. Register the functions. 75e41f4b71Sopenharmony_ci 76e41f4b71Sopenharmony_ci ```C 77e41f4b71Sopenharmony_ci EXTERN_C_START 78e41f4b71Sopenharmony_ci static napi_value Init(napi_env env, napi_value exports) 79e41f4b71Sopenharmony_ci { 80e41f4b71Sopenharmony_ci napi_property_descriptor desc[] = { 81e41f4b71Sopenharmony_ci {"RequestSuspendDelay", nullptr, RequestSuspendDelay, nullptr, nullptr, nullptr, napi_default, nullptr}, 82e41f4b71Sopenharmony_ci {"GetRemainingDelayTime", nullptr, GetRemainingDelayTime, nullptr, nullptr, nullptr, napi_default, nullptr}, 83e41f4b71Sopenharmony_ci {"CancelSuspendDelay", nullptr, CancelSuspendDelay, nullptr, nullptr, nullptr, napi_default, nullptr}, 84e41f4b71Sopenharmony_ci }; 85e41f4b71Sopenharmony_ci napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); 86e41f4b71Sopenharmony_ci return exports; 87e41f4b71Sopenharmony_ci } 88e41f4b71Sopenharmony_ci EXTERN_C_END 89e41f4b71Sopenharmony_ci ``` 90e41f4b71Sopenharmony_ci 91e41f4b71Sopenharmony_ci3. Register the module. 92e41f4b71Sopenharmony_ci 93e41f4b71Sopenharmony_ci ```C 94e41f4b71Sopenharmony_ci static napi_module demoModule = { 95e41f4b71Sopenharmony_ci .nm_version = 1, 96e41f4b71Sopenharmony_ci .nm_flags = 0, 97e41f4b71Sopenharmony_ci .nm_filename = nullptr, 98e41f4b71Sopenharmony_ci .nm_register_func = Init, 99e41f4b71Sopenharmony_ci .nm_modname = "entry", 100e41f4b71Sopenharmony_ci .nm_priv = ((void*)0), 101e41f4b71Sopenharmony_ci .reserved = { 0 }, 102e41f4b71Sopenharmony_ci }; 103e41f4b71Sopenharmony_ci 104e41f4b71Sopenharmony_ci extern "C" __attribute__((constructor)) void RegisterEntryModule(void) 105e41f4b71Sopenharmony_ci { 106e41f4b71Sopenharmony_ci napi_module_register(&demoModule); 107e41f4b71Sopenharmony_ci } 108e41f4b71Sopenharmony_ci ``` 109e41f4b71Sopenharmony_ci 110e41f4b71Sopenharmony_ci### Declaring the Functions in the index.d.ts File 111e41f4b71Sopenharmony_ci 112e41f4b71Sopenharmony_ci ```ts 113e41f4b71Sopenharmony_ci export const RequestSuspendDelay: () => number; 114e41f4b71Sopenharmony_ci export const GetRemainingDelayTime: () => number; 115e41f4b71Sopenharmony_ci export const CancelSuspendDelay: () => number; 116e41f4b71Sopenharmony_ci ``` 117e41f4b71Sopenharmony_ci 118e41f4b71Sopenharmony_ci### Calling the Functions in the index.ets File 119e41f4b71Sopenharmony_ci 120e41f4b71Sopenharmony_ci ```ts 121e41f4b71Sopenharmony_ci import testTransientTask from 'libentry.so'; 122e41f4b71Sopenharmony_ci 123e41f4b71Sopenharmony_ci @Entry 124e41f4b71Sopenharmony_ci @Component 125e41f4b71Sopenharmony_ci struct Index { 126e41f4b71Sopenharmony_ci @State message: string = ''; 127e41f4b71Sopenharmony_ci 128e41f4b71Sopenharmony_ci build() { 129e41f4b71Sopenharmony_ci Row() { 130e41f4b71Sopenharmony_ci Column() { 131e41f4b71Sopenharmony_ci Text(this.message) 132e41f4b71Sopenharmony_ci .fontSize(50) 133e41f4b71Sopenharmony_ci .fontWeight(FontWeight.Bold) 134e41f4b71Sopenharmony_ci Button('Request transient task').onClick(event => { 135e41f4b71Sopenharmony_ci this.RequestSuspendDelay(); 136e41f4b71Sopenharmony_ci }) 137e41f4b71Sopenharmony_ci Button('Obtain remaining time').onClick(event =>{ 138e41f4b71Sopenharmony_ci this.GetRemainingDelayTime(); 139e41f4b71Sopenharmony_ci }) 140e41f4b71Sopenharmony_ci Button('Cancel transient task').onClick(event =>{ 141e41f4b71Sopenharmony_ci this.CancelSuspendDelay(); 142e41f4b71Sopenharmony_ci }) 143e41f4b71Sopenharmony_ci } 144e41f4b71Sopenharmony_ci .width('100%') 145e41f4b71Sopenharmony_ci } 146e41f4b71Sopenharmony_ci .height('100%') 147e41f4b71Sopenharmony_ci } 148e41f4b71Sopenharmony_ci 149e41f4b71Sopenharmony_ci RequestSuspendDelay() { 150e41f4b71Sopenharmony_ci let requestId = testTransientTask.RequestSuspendDelay(); 151e41f4b71Sopenharmony_ci console.log("The return requestId is " + requestId); 152e41f4b71Sopenharmony_ci } 153e41f4b71Sopenharmony_ci 154e41f4b71Sopenharmony_ci GetRemainingDelayTime() { 155e41f4b71Sopenharmony_ci let time = testTransientTask.GetRemainingDelayTime(); 156e41f4b71Sopenharmony_ci console.log("The time is " + time); 157e41f4b71Sopenharmony_ci } 158e41f4b71Sopenharmony_ci 159e41f4b71Sopenharmony_ci CancelSuspendDelay() { 160e41f4b71Sopenharmony_ci let ret = testTransientTask.CancelSuspendDelay(); 161e41f4b71Sopenharmony_ci console.log("The ret is " + ret); 162e41f4b71Sopenharmony_ci } 163e41f4b71Sopenharmony_ci } 164e41f4b71Sopenharmony_ci 165e41f4b71Sopenharmony_ci ``` 166e41f4b71Sopenharmony_ci 167e41f4b71Sopenharmony_ci### Configuring the Library Dependency 168e41f4b71Sopenharmony_ci 169e41f4b71Sopenharmony_ciConfigure the **CMakeLists.txt** file. Add the required shared library, that is, **libtransient_task.so**, to **target_link_libraries** in the **CMakeLists.txt** file automatically generated by the project. 170e41f4b71Sopenharmony_ci 171e41f4b71Sopenharmony_ci## How to Test 172e41f4b71Sopenharmony_ci 173e41f4b71Sopenharmony_ci1. Connect to the device and run the program. 174e41f4b71Sopenharmony_ci 175e41f4b71Sopenharmony_ci2. Touch the **Request transient task** button. The console prints a log. The following is an example: 176e41f4b71Sopenharmony_ci 177e41f4b71Sopenharmony_ci ``` 178e41f4b71Sopenharmony_ci The return requestId is 1 179e41f4b71Sopenharmony_ci ``` 180e41f4b71Sopenharmony_ci 181e41f4b71Sopenharmony_ci3. Touch the **Obtain remaining time** button. The console prints a log. The following is an example: 182e41f4b71Sopenharmony_ci 183e41f4b71Sopenharmony_ci ``` 184e41f4b71Sopenharmony_ci The return requestId is 18000 185e41f4b71Sopenharmony_ci ``` 186e41f4b71Sopenharmony_ci4. Touch the **Cancel transient task** button. The console prints a log. The following is an example: 187e41f4b71Sopenharmony_ci 188e41f4b71Sopenharmony_ci ``` 189e41f4b71Sopenharmony_ci The ret is 0 190e41f4b71Sopenharmony_ci ``` 191e41f4b71Sopenharmony_ci> **NOTE** 192e41f4b71Sopenharmony_ci> 193e41f4b71Sopenharmony_ci>If the **Request transient task** button is touched for more than three consecutive times, an error is reported. For more constraints, see [Transient Task (ArkTS)](transient-task.md#constraints). 194