文档管理中心
您当前正在浏览新版开发者文档中心,目录分类和层级有所调整。点击左侧当前文档分类名称前的“☰”图标,可切换文档分类。 了解新版目录
指南与API参考指南应用框架Background Tasks Kit(后台任务开发服务)短时任务(C/C++)

短时任务(C/C++)

场景介绍

应用退至后台一小段时间后,应用进程会被挂起,无法执行对应的任务。如果应用在后台仍需要执行耗时不长的任务,如状态保存等,可以通过本文申请短时任务,扩展应用在后台的运行时间。

约束与限制

申请短时任务的按钮,不可连续点击超过3次,否则会超出短时任务数量限制并报错。使用过程中更多的约束与限制请参考短时任务(ArkTS)的约束与限制。

开发步骤

在napi_init.cpp文件中封装接口并注册模块

  1. 封装函数

    收起
    自动换行
    深色代码主题
    复制
    1. #include "napi/native_api.h"
    2. #include "transient_task/transient_task_api.h"
    3. TransientTask_DelaySuspendInfo delaySuspendInfo;
    4. const int32_t TransientTask_TIMER = 3;
    5. static void Callback(void)
    6. {
    7. // 短时任务即将结束,业务在这里取消短时任务
    8. OH_BackgroundTaskManager_CancelSuspendDelay(delaySuspendInfo.requestId);
    9. }
    10. // 申请短时任务
    11. static napi_value RequestSuspendDelay(napi_env env, napi_callback_info info)
    12. {
    13. napi_value result;
    14. int32_t res = OH_BackgroundTaskManager_RequestSuspendDelay("test", Callback, &delaySuspendInfo);
    15. if (res == 0) {
    16. napi_create_int32(env, delaySuspendInfo.requestId, &result);
    17. } else {
    18. napi_create_int32(env, -1, &result);
    19. }
    20. return result;
    21. }
    22. // 获取剩余时间
    23. static napi_value GetRemainingDelayTime(napi_env env, napi_callback_info info)
    24. {
    25. napi_value result;
    26. int32_t delayTime = 0;
    27. int32_t res = OH_BackgroundTaskManager_GetRemainingDelayTime(delaySuspendInfo.requestId, &delayTime);
    28. if (res == 0) {
    29. napi_create_int32(env, delayTime, &result);
    30. } else {
    31. napi_create_int32(env, -1, &result);
    32. }
    33. return result;
    34. }
    35. // 取消短时任务
    36. static napi_value CancelSuspendDelay(napi_env env, napi_callback_info info)
    37. {
    38. napi_value result;
    39. int32_t res = OH_BackgroundTaskManager_CancelSuspendDelay(delaySuspendInfo.requestId);
    40. napi_create_int32(env, res, &result);
    41. return result;
    42. }
    43. // 获取所有短时任务信息
    44. TransientTask_TransientTaskInfo transientTaskInfo;
    45. static napi_value GetTransientTaskInfo(napi_env env, napi_callback_info info)
    46. {
    47. napi_value result;
    48. napi_create_object(env, &result);
    49. int32_t res = OH_BackgroundTaskManager_GetTransientTaskInfo(&transientTaskInfo);
    50. napi_value napiRemainingQuota = nullptr;
    51. // 获取成功,格式化数据并返回给接口
    52. if (res == 0) {
    53. napi_create_int32(env, transientTaskInfo.remainingQuota, &napiRemainingQuota);
    54. napi_set_named_property(env, result, "remainingQuota", napiRemainingQuota); // 格式化当日总配额
    55. napi_value info {nullptr};
    56. napi_create_array(env, &info);
    57. uint32_t count = 0;
    58. // 格式化所有已申请的短时任务信息
    59. for (int index = 0; index < TransientTask_TIMER; index++) {
    60. if (transientTaskInfo.transientTasks[index].requestId == 0) {
    61. continue;
    62. }
    63. napi_value napiWork = nullptr;
    64. napi_create_object(env, &napiWork);
    65. napi_value napiRequestId = nullptr;
    66. napi_create_int32(env, transientTaskInfo.transientTasks[index].requestId, &napiRequestId);
    67. napi_set_named_property(env, napiWork, "requestId", napiRequestId);
    68. napi_value napiActualDelayTime = nullptr;
    69. napi_create_int32(env, transientTaskInfo.transientTasks[index].actualDelayTime, &napiActualDelayTime);
    70. napi_set_named_property(env, napiWork, "actualDelayTime", napiActualDelayTime);
    71. napi_set_element(env, info, count, napiWork);
    72. count++;
    73. }
    74. napi_set_named_property(env, result, "transientTasks", info);
    75. } else {
    76. napi_create_int32(env, 0, &napiRemainingQuota);
    77. napi_set_named_property(env, result, "remainingQuota", napiRemainingQuota);
    78. napi_value info {nullptr};
    79. napi_create_array(env, &info);
    80. napi_set_named_property(env, result, "transientTasks", info);
    81. }
    82. return result;
    83. }
  2. 注册函数

    收起
    自动换行
    深色代码主题
    复制
    1. EXTERN_C_START
    2. static napi_value Init(napi_env env, napi_value exports)
    3. {
    4. napi_property_descriptor desc[] = {
    5. {"RequestSuspendDelay", nullptr, RequestSuspendDelay, nullptr, nullptr, nullptr, napi_default, nullptr},
    6. {"GetRemainingDelayTime", nullptr, GetRemainingDelayTime, nullptr, nullptr, nullptr, napi_default, nullptr},
    7. {"CancelSuspendDelay", nullptr, CancelSuspendDelay, nullptr, nullptr, nullptr, napi_default, nullptr},
    8. {"GetTransientTaskInfo", nullptr, GetTransientTaskInfo, nullptr, nullptr, nullptr, napi_default, nullptr },
    9. };
    10. napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
    11. return exports;
    12. }
    13. EXTERN_C_END
  3. 注册模块

    收起
    自动换行
    深色代码主题
    复制
    1. static napi_module demoModule = {
    2. .nm_version = 1,
    3. .nm_flags = 0,
    4. .nm_filename = nullptr,
    5. .nm_register_func = Init,
    6. .nm_modname = "entry",
    7. .nm_priv = ((void*)0),
    8. .reserved = { 0 },
    9. };
    10. extern "C" __attribute__((constructor)) void RegisterEntryModule(void)
    11. {
    12. napi_module_register(&demoModule);
    13. }

在index.d.ts文件中声明函数

收起
自动换行
深色代码主题
复制
  1. import backgroundTaskManager from '@kit.BackgroundTasksKit';
  2. export const RequestSuspendDelay: () => number;
  3. export const GetRemainingDelayTime: () => number;
  4. export const CancelSuspendDelay: () => number;
  5. export const GetTransientTaskInfo: () => backgroundTaskManager.TransientTaskInfo;

在index.ets文件中调用函数

收起
自动换行
深色代码主题
复制
  1. import testTransientTask from 'libentry.so';
  2. @Entry
  3. @Component
  4. struct Index {
  5. @State message: string = '';
  6. // ...
  7. build() {
  8. Row() {
  9. Column() {
  10. // ...
  11. Text(this.message)
  12. .fontSize(50)
  13. .fontWeight(FontWeight.Bold)
  14. Button() {
  15. Text("RequestSuspendDelay").fontSize(20)
  16. }
  17. .id('request_suspend_delay')
  18. .margin({ top: 10, bottom: 10 })
  19. .width(250)
  20. .height(40)
  21. .backgroundColor('#0D9FFB')
  22. .onClick(() => {
  23. this.RequestSuspendDelay();
  24. })
  25. Button(){
  26. Text('GetRemainingDelayTime').fontSize(20)
  27. }
  28. .id('get_remaining_delay_time')
  29. .margin({ top: 10, bottom: 10 })
  30. .width(250)
  31. .height(40)
  32. .backgroundColor('#0D9FFB')
  33. .onClick(() => {
  34. this.GetRemainingDelayTime();
  35. })
  36. Button(){
  37. Text('CancelSuspendDelay').fontSize(20)
  38. }
  39. .id('cancel_suspend_delay')
  40. .margin({ top: 10, bottom: 10 })
  41. .width(250)
  42. .height(40)
  43. .backgroundColor('#0D9FFB')
  44. .onClick(() => {
  45. this.CancelSuspendDelay();
  46. })
  47. Button(){
  48. Text('GetTransientTaskInfo').fontSize(20)
  49. }
  50. .id('get_transient_task_info')
  51. .margin({ top: 10, bottom: 10 })
  52. .width(250)
  53. .height(40)
  54. .backgroundColor('#0D9FFB')
  55. .onClick(() => {
  56. this.GetTransientTaskInfo();
  57. })
  58. }
  59. .width('100%')
  60. }
  61. .height('100%')
  62. }
  63. RequestSuspendDelay() {
  64. let requestId = testTransientTask.RequestSuspendDelay();
  65. // ...
  66. console.info('The returned requestId is ' + requestId);
  67. }
  68. GetRemainingDelayTime() {
  69. let time = testTransientTask.GetRemainingDelayTime();
  70. console.info('The time is ' + time);
  71. }
  72. CancelSuspendDelay() {
  73. let result = testTransientTask.CancelSuspendDelay();
  74. console.info('The return value is ' + result);
  75. }
  76. GetTransientTaskInfo() {
  77. let info = testTransientTask.GetTransientTaskInfo();
  78. console.info('The transientTaskInfo is ' + JSON.stringify(info));
  79. }
  80. }

配置库依赖

配置CMakeLists.txt,本模块需要用到的共享库是libtransient_task.so,在工程自动生成的CMakeLists.txt中的target_link_libraries中添加此共享库。

收起
自动换行
深色代码主题
复制
  1. target_link_libraries(entry PUBLIC libace_napi.z.so libtransient_task.so)

测试步骤

  1. 连接设备并运行程序。

  2. 点击 申请短时任务 按钮,控制台会打印日志,示例如下:

    收起
    自动换行
    深色代码主题
    复制
    1. The returned requestId is 1
  3. 点击 获取剩余时间 按钮,控制台会打印日志,示例如下:

    收起
    自动换行
    深色代码主题
    复制
    1. The time is 18000
  4. 点击 取消短时任务 按钮,控制台会打印日志,示例如下:

    收起
    自动换行
    深色代码主题
    复制
    1. The return value is 0
  5. 点击 获取所有短时任务信息 按钮,控制台会打印日志,示例如下:

    收起
    自动换行
    深色代码主题
    复制
    1. The transientTaskInfo is {"remainingQuota":600000,"transientTasks":[]}