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