HarmonyOS APP延迟任务:让系统在最佳时机替你干活

举报
Jack20 发表于 2026/06/20 15:07:44 2026/06/20
【摘要】 HarmonyOS APP延迟任务:让系统在最佳时机替你干活📌 核心要点:延迟任务通过 workScheduler 调度,在满足网络、充电、存储等约束条件时由系统自动执行,是后台数据同步和静默处理的最佳选择。 一、背景与动机先说个生活中的例子。你有一大堆衣服要洗,但洗衣机洗衣服要耗水耗电。你会怎么做?肯定是等电费半价的夜间、或者周末有空的时候再洗,而不是一有脏衣服就立刻开洗衣机。延迟任务...

HarmonyOS APP延迟任务:让系统在最佳时机替你干活

📌 核心要点:延迟任务通过 workScheduler 调度,在满足网络、充电、存储等约束条件时由系统自动执行,是后台数据同步和静默处理的最佳选择。


一、背景与动机

先说个生活中的例子。你有一大堆衣服要洗,但洗衣机洗衣服要耗水耗电。你会怎么做?肯定是等电费半价的夜间、或者周末有空的时候再洗,而不是一有脏衣服就立刻开洗衣机。

延迟任务就是这个思路——活儿可以先攒着,等条件合适了再干

在应用开发中,这种场景太常见了:

  • 你的 App 需要同步用户数据到云端,但用户正在用流量看视频,你总不能这时候偷偷上传数据吧?
  • 你的 App 需要清理缓存,但手机电量只剩 5%,你这时候清理不是雪上加霜吗?
  • 你的 App 需要预加载明天的内容,但用户在地铁上信号断断续续,加载了也白搭。

这些场景的共同点是:任务不急,但条件很重要。HarmonyOS 的延迟任务(Deferred Task)就是为这类场景设计的。你只需要告诉系统"我要干什么、需要什么条件",系统会在条件满足时自动帮你执行,完全不需要你操心时机问题。

和长时任务最大的区别是:延迟任务不需要通知栏,用户完全无感知。系统就像一个贴心的管家,趁你不注意的时候把活儿悄悄干了。


二、核心原理

2.1 workScheduler 调度模型

延迟任务的核心是 @ohos.resourceschedule.workScheduler 模块。它的工作模型可以概括为"注册条件 → 系统调度 → 回调执行":

flowchart TD
    A([应用注册延迟任务]) --> B[设置约束条件]
    B --> C[提交到 workScheduler]
    C --> D[系统加入调度队列]

    D --> E{系统评估执行条件}
    E -->|条件不满足| F[继续等待]
    F --> E

    E -->|条件满足| G[系统唤醒应用]
    G --> H[执行 WorkSchedulerExtension 回调]
    H --> I[执行后台任务逻辑]
    I --> J{任务是否完成?}
    J -->|否,还需继续| K[重新注册延迟任务]
    K --> D
    J -->|| L([任务完成])

    classDef primary fill:#4CAF50,stroke:#388E3C,color:#fff
    classDef warning fill:#FF9800,stroke:#F57C00,color:#fff
    classDef error fill:#F44336,stroke:#D32F2F,color:#fff
    classDef info fill:#2196F3,stroke:#1976D2,color:#fff
    classDef purple fill:#9C27B0,stroke:#7B1FA2,color:#fff

    class A,L primary
    class B,C,D,G,H,I info
    class E,F,K warning
    class J purple

2.2 约束条件详解

延迟任务的精髓在于约束条件。你可以灵活组合多种条件,精确控制任务的执行时机:

约束条件 参数 说明 适用场景
网络类型 networkType 指定需要的网络类型 大文件上传需 Wi-Fi
充电状态 isCharging 是否在充电 耗电操作需充电时执行
电量水平 batteryLevel 最低电量要求 避免低电量时执行
存储状态 storageRequest 存储空间需求 缓存清理需空间不足时
重复间隔 repeatInterval 最小执行间隔 控制执行频率
是否重复 isRepeat 是否重复执行 一次性 vs 周期性

2.3 延迟任务与 Doze 模式的关系

Doze 模式是系统的省电机制,设备静止一段时间后会进入 Doze 状态,限制后台活动。延迟任务和 Doze 模式的关系可以用"合作共赢"来形容:

graph TB
    subgraph Doze模式
        A[设备静止] --> B[浅度Doze]
        B --> C[限制网络访问]
        B --> D[延迟Alarm]
        B --> E[延迟同步]

        B --> F[持续静止]
        F --> G[深度Doze]
        G --> H[严格限制CPU]
        G --> I[禁止网络访问]
    end

    subgraph 延迟任务
        J[workScheduler注册任务] --> K[设置充电条件]
        K --> L[充电时Doze自动退出]
        L --> M[条件满足,执行任务]
    end

    E -.->|延迟任务不受Doze Alarm限制| J
    L -.->|充电状态可退出Doze| G

    classDef primary fill:#4CAF50,stroke:#388E3C,color:#fff
    classDef warning fill:#FF9800,stroke:#F57C00,color:#fff
    classDef error fill:#F44336,stroke:#D32F2F,color:#fff
    classDef info fill:#2196F3,stroke:#1976D2,color:#fff
    classDef purple fill:#9C27B0,stroke:#7B1FA2,color:#fff

    class A,B,F,G error
    class C,D,E,H,I warning
    class J,K,L,M primary

关键点:

  • 延迟任务不受 Doze 模式的 Alarm 限制,系统会在 Doze 维护窗口中调度延迟任务
  • 如果延迟任务设置了充电条件,充电时设备会退出 Doze,任务可以正常执行
  • 延迟任务的网络条件在 Doze 模式下可能无法满足,系统会等到 Doze 维护窗口再评估

三、代码实战

3.1 基础延迟任务:条件触发数据同步

最常见的延迟任务场景——在充电 + Wi-Fi 条件下同步数据:

import workScheduler from '@ohos.resourceschedule.workScheduler';
import { BusinessError } from '@ohos.base';

/**
 * 延迟任务管理器
 * 封装 workScheduler 的注册、查询、取消等操作
 */
export class DeferredTaskManager {
  /** 延迟任务ID,全局唯一 */
  private readonly SYNC_TASK_ID: number = 10001;
  /** 延迟任务名称 */
  private readonly SYNC_TASK_NAME: string = 'dataSyncTask';

  /**
   * 注册数据同步延迟任务
   * 条件:充电 + Wi-Fi + 电量高于30%
   */
  async registerDataSyncTask(): Promise<void> {
    try {
      // 构建延迟任务参数
      const workInfo: workScheduler.WorkInfo = {
        workId: this.SYNC_TASK_ID,
        // 网络类型:Wi-Fi
        networkType: workScheduler.NetworkType.NETWORK_TYPE_WIFI,
        // 充电状态:是
        isCharging: true,
        // 电量水平:大于30%
        batteryLevel: 30,
        // 电量条件:电量高于设定值时触发
        batteryStatus: workScheduler.BatteryStatus.BATTERY_STATUS_HIGH,
        // 存储需求:无特殊要求
        storageRequest: workScheduler.StorageRequest.STORAGE_LEVEL_LOW,
        // 是否重复:否(一次性任务)
        isRepeat: false,
        // 回调能力名称,对应 WorkSchedulerExtension
        abilityName: this.SYNC_TASK_NAME,
        // 额外参数,传递给回调
        parameters: {
          syncType: 'full',
          maxRetryCount: '3',
        },
      };

      // 注册延迟任务
      workScheduler.startWork(workInfo);
      console.info('[延迟任务] 数据同步任务注册成功');
      console.info('[延迟任务] 执行条件: Wi-Fi + 充电 + 电量>30%');

    } catch (error) {
      const err = error as BusinessError;
      console.error(`[延迟任务] 注册失败,错误码: ${err.code},错误信息: ${err.message}`);
    }
  }

  /**
   * 查询延迟任务状态
   */
  async queryTaskStatus(): Promise<void> {
    try {
      // 获取指定任务的状态
      const workInfo = workScheduler.getWorkStatusSync(this.SYNC_TASK_ID);

      if (workInfo) {
        console.info(`[延迟任务] 任务状态: ${JSON.stringify(workInfo)}`);
      } else {
        console.info('[延迟任务] 未找到该任务');
      }

      // 获取所有延迟任务
      const allWorks = workScheduler.obtainAllWorksSync();
      console.info(`[延迟任务] 当前共有 ${allWorks.length} 个延迟任务`);

    } catch (error) {
      const err = error as BusinessError;
      console.error(`[延迟任务] 查询失败,错误码: ${err.code}`);
    }
  }

  /**
   * 取消延迟任务
   */
  async cancelDataSyncTask(): Promise<void> {
    try {
      workScheduler.stopWork(this.SYNC_TASK_ID);
      console.info('[延迟任务] 数据同步任务已取消');

    } catch (error) {
      const err = error as BusinessError;
      console.error(`[延迟任务] 取消失败,错误码: ${err.code}`);
    }
  }
}

3.2 WorkSchedulerExtension 回调实现

延迟任务被系统调度时,会回调 WorkSchedulerExtension。这是实际执行后台逻辑的地方:

import WorkSchedulerExtensionAbility from '@ohos.app.ability.WorkSchedulerExtensionAbility';
import workScheduler from '@ohos.resourceschedule.workScheduler';

/**
 * 延迟任务回调扩展
 * 在 module.json5 中注册,系统调度延迟任务时自动回调
 */
export default class DataSyncWorkScheduler extends WorkSchedulerExtensionAbility {

  /**
   * 延迟任务开始执行的回调
   * 在这里执行实际的后台任务逻辑
   */
  onWorkStart(workInfo: workScheduler.WorkInfo): void {
    console.info('[延迟回调] 任务开始执行');
    console.info(`[延迟回调] 任务ID: ${workInfo.workId}`);
    console.info(`[延迟回调] 任务参数: ${JSON.stringify(workInfo.parameters)}`);

    // 获取传递的参数
    const syncType = workInfo.parameters?.syncType as string || 'incremental';
    const maxRetry = parseInt(workInfo.parameters?.maxRetryCount as string || '3', 10);

    // 根据同步类型执行不同的同步逻辑
    this.executeSync(syncType, maxRetry);
  }

  /**
   * 执行数据同步
   */
  private async executeSync(syncType: string, maxRetry: number): Promise<void> {
    let retryCount = 0;

    while (retryCount < maxRetry) {
      try {
        if (syncType === 'full') {
          console.info('[延迟回调] 执行全量数据同步...');
          await this.fullSync();
        } else {
          console.info('[延迟回调] 执行增量数据同步...');
          await this.incrementalSync();
        }

        // 同步成功,退出重试循环
        console.info('[延迟回调] 数据同步成功');
        return;

      } catch (error) {
        retryCount++;
        console.error(`[延迟回调] 第${retryCount}次同步失败,${retryCount < maxRetry ? '将重试' : '已达最大重试次数'}`);

        if (retryCount >= maxRetry) {
          // 重试次数用尽,注册新的延迟任务稍后再试
          this.registerRetryTask(syncType, retryCount);
          return;
        }

        // 等待一段时间后重试
        await this.delay(5000 * retryCount);
      }
    }
  }

  /**
   * 全量数据同步
   */
  private async fullSync(): Promise<void> {
    // 模拟网络请求
    await new Promise<void>(resolve => setTimeout(resolve, 2000));
    console.info('[延迟回调] 全量同步完成');
  }

  /**
   * 增量数据同步
   */
  private async incrementalSync(): Promise<void> {
    // 模拟网络请求
    await new Promise<void>(resolve => setTimeout(resolve, 1000));
    console.info('[延迟回调] 增量同步完成');
  }

  /**
   * 注册重试任务
   * 当前任务失败后,注册一个新的延迟任务稍后重试
   */
  private registerRetryTask(syncType: string, failedCount: number): void {
    try {
      const retryWorkInfo: workScheduler.WorkInfo = {
        workId: 10001 + failedCount, // 使用不同的ID
        networkType: workScheduler.NetworkType.NETWORK_TYPE_WIFI,
        isCharging: true,
        batteryLevel: 30,
        isRepeat: false,
        abilityName: 'dataSyncTask',
        parameters: {
          syncType: syncType,
          maxRetryCount: String(Math.max(0, 3 - failedCount)),
          isRetry: 'true',
        },
      };

      workScheduler.startWork(retryWorkInfo);
      console.info('[延迟回调] 已注册重试任务');

    } catch (error) {
      console.error('[延迟回调] 注册重试任务失败');
    }
  }

  /**
   * 延迟任务执行结束的回调
   */
  onWorkStop(workInfo: workScheduler.WorkInfo): void {
    console.info(`[延迟回调] 任务执行结束,任务ID: ${workInfo.workId}`);
  }

  /**
   * 工具方法:延迟
   */
  private delay(ms: number): Promise<void> {
    return new Promise(resolve => setTimeout(resolve, ms));
  }
}

⚠️ 注意WorkSchedulerExtension 需要在 module.json5 中注册:

{
  "extensionAbilities": [
    {
      "name": "dataSyncTask",
      "type": "workScheduler",
      "srcEntry": "./ets/workscheduler/DataSyncWorkScheduler.ets"
    }
  ]
}

3.3 多条件组合的延迟任务调度策略

在实际项目中,我们经常需要根据不同的业务场景组合不同的约束条件。下面是一个完整的调度策略封装:

import workScheduler from '@ohos.resourceschedule.workScheduler';
import { BusinessError } from '@ohos.base';

/**
 * 延迟任务策略枚举
 * 定义不同的调度策略,对应不同的约束条件组合
 */
export enum DeferredTaskStrategy {
  /** 省电模式:充电+Wi-Fi,适合大文件操作 */
  POWER_SAVING = 'power_saving',
  /** 普通模式:Wi-Fi,适合日常数据同步 */
  NORMAL = 'normal',
  /** 紧急模式:任意网络,适合紧急数据上报 */
  URGENT = 'urgent',
  /** 离线模式:无网络要求,适合本地数据处理 */
  OFFLINE = 'offline',
}

/**
 * 延迟任务调度器
 * 根据不同策略自动配置约束条件
 */
export class WorkSchedulerDispatcher {
  /** 任务ID计数器 */
  private static taskIdCounter: number = 20000;

  /**
   * 根据策略注册延迟任务
   * @param strategy 调度策略
   * @param abilityName WorkSchedulerExtension 名称
   * @param parameters 传递给回调的参数
   * @returns 任务ID
   */
  static schedule(
    strategy: DeferredTaskStrategy,
    abilityName: string,
    parameters?: Record<string, string>
  ): number {
    const taskId = ++this.taskIdCounter;

    // 根据策略构建不同的约束条件
    let workInfo: workScheduler.WorkInfo;

    switch (strategy) {
      case DeferredTaskStrategy.POWER_SAVING:
        // 省电模式:充电 + Wi-Fi + 高电量
        workInfo = {
          workId: taskId,
          networkType: workScheduler.NetworkType.NETWORK_TYPE_WIFI,
          isCharging: true,
          batteryLevel: 50,
          batteryStatus: workScheduler.BatteryStatus.BATTERY_STATUS_HIGH,
          isRepeat: false,
          abilityName: abilityName,
          parameters: parameters || {},
        };
        break;

      case DeferredTaskStrategy.NORMAL:
        // 普通模式:Wi-Fi + 电量>20%
        workInfo = {
          workId: taskId,
          networkType: workScheduler.NetworkType.NETWORK_TYPE_WIFI,
          batteryLevel: 20,
          batteryStatus: workScheduler.BatteryStatus.BATTERY_STATUS_LOW_OR_ABOVE,
          isRepeat: false,
          abilityName: abilityName,
          parameters: parameters || {},
        };
        break;

      case DeferredTaskStrategy.URGENT:
        // 紧急模式:任意网络 + 无充电要求
        workInfo = {
          workId: taskId,
          networkType: workScheduler.NetworkType.NETWORK_TYPE_ANY,
          isRepeat: false,
          abilityName: abilityName,
          parameters: parameters || {},
        };
        break;

      case DeferredTaskStrategy.OFFLINE:
        // 离线模式:无网络要求,适合本地操作
        workInfo = {
          workId: taskId,
          isRepeat: false,
          abilityName: abilityName,
          parameters: parameters || {},
        };
        break;

      default:
        throw new Error(`未知的调度策略: ${strategy}`);
    }

    try {
      workScheduler.startWork(workInfo);
      console.info(`[调度器] 策略=${strategy}, 任务ID=${taskId}, 已注册成功`);
      return taskId;
    } catch (error) {
      const err = error as BusinessError;
      console.error(`[调度器] 注册失败,错误码: ${err.code}`);
      return -1;
    }
  }

  /**
   * 取消指定延迟任务
   */
  static cancel(taskId: number): void {
    try {
      workScheduler.stopWork(taskId);
      console.info(`[调度器] 任务ID=${taskId} 已取消`);
    } catch (error) {
      const err = error as BusinessError;
      console.error(`[调度器] 取消失败,错误码: ${err.code}`);
    }
  }

  /**
   * 取消所有延迟任务
   */
  static cancelAll(): void {
    try {
      workScheduler.stopAllWorks();
      console.info('[调度器] 所有延迟任务已取消');
    } catch (error) {
      const err = error as BusinessError;
      console.error(`[调度器] 批量取消失败,错误码: ${err.code}`);
    }
  }

  /**
   * 获取当前所有延迟任务的概览
   */
  static getOverview(): Array<{
    taskId: number;
    strategy: string;
    status: string;
  }> {
    try {
      const allWorks = workScheduler.obtainAllWorksSync();
      return allWorks.map(work => ({
        taskId: work.workId,
        strategy: this.inferStrategy(work),
        status: '已注册',
      }));
    } catch (error) {
      console.error('[调度器] 获取概览失败');
      return [];
    }
  }

  /**
   * 根据约束条件推断策略类型
   */
  private static inferStrategy(work: workScheduler.WorkInfo): string {
    if (work.isCharging && work.networkType === workScheduler.NetworkType.NETWORK_TYPE_WIFI) {
      return DeferredTaskStrategy.POWER_SAVING;
    }
    if (work.networkType === workScheduler.NetworkType.NETWORK_TYPE_WIFI) {
      return DeferredTaskStrategy.NORMAL;
    }
    if (work.networkType === workScheduler.NetworkType.NETWORK_TYPE_ANY) {
      return DeferredTaskStrategy.URGENT;
    }
    return DeferredTaskStrategy.OFFLINE;
  }
}

// ============ 使用示例 ============

/**
 * 演示不同策略的延迟任务注册
 */
function demoSchedulerStrategies(): void {
  // 场景一:大文件备份,省电模式
  const backupTaskId = WorkSchedulerDispatcher.schedule(
    DeferredTaskStrategy.POWER_SAVING,
    'backupWorkScheduler',
    { type: 'photo_backup', count: '150' }
  );

  // 场景二:日常数据同步,普通模式
  const syncTaskId = WorkSchedulerDispatcher.schedule(
    DeferredTaskStrategy.NORMAL,
    'dataSyncWorkScheduler',
    { syncScope: 'user_data' }
  );

  // 场景三:紧急错误上报,紧急模式
  const reportTaskId = WorkSchedulerDispatcher.schedule(
    DeferredTaskStrategy.URGENT,
    'crashReportWorkScheduler',
    { crashId: 'CRASH_20260620_001', severity: 'high' }
  );

  // 场景四:本地缓存清理,离线模式
  const cleanTaskId = WorkSchedulerDispatcher.schedule(
    DeferredTaskStrategy.OFFLINE,
    'cacheCleanWorkScheduler',
    { maxCacheSize: '500MB' }
  );

  // 查看所有任务概览
  const overview = WorkSchedulerDispatcher.getOverview();
  console.info(`[调度器] 当前注册了 ${overview.length} 个延迟任务`);
  overview.forEach(item => {
    console.info(`  - 任务${item.taskId}: 策略=${item.strategy}, 状态=${item.status}`);
  });
}

四、踩坑与注意事项

4.1 workId 必须全局唯一

踩坑:两个不同的延迟任务使用了相同的 workId,后注册的任务会覆盖前一个,导致前一个任务永远无法执行。

解决方案:使用自增计数器或 UUID 生成唯一的 workId

// ❌ 错误:硬编码 workId
const workInfo = { workId: 1, ... };

// ✅ 正确:使用自增ID
private static taskIdCounter: number = 10000;
const taskId = ++this.taskCounter;
const workInfo = { workId: taskId, ... };

4.2 约束条件不是越多越好

踩坑:设置了太多约束条件(网络+充电+电量+存储+定时),导致条件几乎不可能同时满足,任务永远无法执行。

解决方案:只设置必要的约束条件。一般来说,2-3 个条件组合是最合理的。

// ❌ 过度约束:几乎不可能同时满足
workInfo = {
  networkType: workScheduler.NetworkType.NETWORK_TYPE_WIFI,
  isCharging: true,
  batteryLevel: 80,
  batteryStatus: workScheduler.BatteryStatus.BATTERY_STATUS_FULL,
  storageRequest: workScheduler.StorageRequest.STORAGE_LEVEL_OK,
  // ... 再加几个条件,任务基本不会执行
};

// ✅ 合理约束:2-3个条件
workInfo = {
  networkType: workScheduler.NetworkType.NETWORK_TYPE_WIFI,
  isCharging: true,
  batteryLevel: 30,
};

4.3 WorkSchedulerExtension 执行时间有限

踩坑:在 onWorkStart 中执行了耗时很长的操作(比如下载 1GB 的文件),系统可能会在任务执行中途强制终止。

解决方案:延迟任务适合执行短时操作(通常不超过 10 分钟)。如果任务确实很长,应该在回调中拆分为多个子任务,每个子任务执行完后注册下一个延迟任务。

4.4 延迟任务不保证精确时间

踩坑:设置了 repeatInterval: 60 * 60 * 1000(1小时),以为任务会每小时精确执行一次。

解决方案repeatInterval 是最小间隔,不是精确间隔。系统会根据电量、Doze 状态、应用待机分组等因素调整实际执行时间。如果需要精确时间执行,应该使用 reminderAgentManagerAlarm

4.5 abilityName 必须与 module.json5 注册一致

踩坑workInfo.abilityName 写错了,和 module.json5 中注册的 Extension 名称不一致,导致系统找不到回调,任务执行失败。

解决方案:仔细核对 abilityNamemodule.json5 中的 name 字段。


五、HarmonyOS 6 适配

5.1 API 变更

变更项 HarmonyOS 5.0 HarmonyOS 6
任务注册 startWork() 新增scheduleWork() 异步版本
任务查询 getWorkStatusSync() 新增getWorkStatus() 异步版本
调度策略 仅支持约束条件 新增智能调度,系统根据使用习惯优化执行时机
执行时长 有限制但无明确API 新增estimatedExecutionTimeMs 参数
回调增强 onWorkStart/onWorkStop 新增onWorkFailed 失败回调

5.2 迁移指南

  1. 智能调度:6.0 的 workScheduler 引入了基于用户习惯的智能调度。系统会学习用户的使用模式,在用户最可能使用应用之前提前执行延迟任务,让数据提前就绪。
  2. 失败回调:6.0 新增了 onWorkFailed 回调,可以在任务执行失败时得到通知,而不需要手动查询状态:
// HarmonyOS 6 新增的失败回调
onWorkFailed(workInfo: workScheduler.WorkInfo, errorCode: number): void {
  console.error(`[延迟回调] 任务执行失败,任务ID: ${workInfo.workId},错误码: ${errorCode}`);
  // 根据错误码决定是否重试
  if (errorCode === workScheduler.ErrorCode.NETWORK_UNAVAILABLE) {
    // 网络不可用,注册新的延迟任务等待网络恢复
    this.registerRetryTask(workInfo);
  }
}
  1. 执行时长预估:6.0 允许在注册任务时预估执行时长,帮助系统更好地调度:
const workInfo: workScheduler.WorkInfo = {
  workId: taskId,
  networkType: workScheduler.NetworkType.NETWORK_TYPE_WIFI,
  isCharging: true,
  isRepeat: false,
  abilityName: 'dataSyncTask',
  // HarmonyOS 6 新增:预估执行时长
  estimatedExecutionTimeMs: 5 * 60 * 1000, // 预估5分钟
};

六、总结

核心知识点回顾

延迟任务(Deferred Task)
├── 核心API
│   ├── startWork() → 注册延迟任务
│   ├── stopWork() → 取消延迟任务
│   ├── getWorkStatusSync() → 查询任务状态
│   └── obtainAllWorksSync() → 获取所有任务
│
├── 约束条件
│   ├── networkType → 网络类型(Wi-Fi/任意/无)
│   ├── isCharging → 充电状态
│   ├── batteryLevel → 电量阈值
│   ├── batteryStatus → 电量状态
│   ├── storageRequest → 存储需求
│   └── isRepeat → 是否重复
│
├── 回调机制
│   ├── WorkSchedulerExtension
│   ├── onWorkStart() → 任务开始执行
│   ├── onWorkStop() → 任务执行结束
│   └── module.json5 注册
│
├── 调度策略
│   ├── 省电模式 → 充电+Wi-Fi+高电量
│   ├── 普通模式 → Wi-Fi+电量>20%
│   ├── 紧急模式 → 任意网络
│   └── 离线模式 → 无网络要求
│
├── 与Doze模式
│   ├── 不受Doze Alarm限制
│   ├── 在Doze维护窗口中调度
│   └── 充电条件可退出Doze
│
└── 开发准则
    ├── workId全局唯一
    ├── 约束条件2-3个为宜
    ├── 执行时长不超过10分钟
    ├── abilityName与注册一致
    └── 不保证精确执行时间

一句话总结:延迟任务是"聪明"的后台任务——你告诉系统条件,系统帮你找时机。约束条件设对了,任务自然水到渠成;设错了,任务就永远等不到天亮。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。