HarmonyOS鸿蒙Next中卡片如何实现定时任务及类似时钟的年月日时分秒实时更新效果

HarmonyOS鸿蒙Next中卡片如何实现定时任务及类似时钟的年月日时分秒实时更新效果 我见他人的应用可以实现 大概是怎么实现的呢 我已经把他的后台app强制关掉了。但是卡片时钟依然是更新的 请问该怎么实现

9 回复

【解决方案】

由于卡片被动刷新的次数有限,无法直接在服务卡片上实现分钟级刷新的效果。如果引入TextClock组件后,可通过监听onDateChange回调函数间接实现服务卡片刷新,事件回调间隔为分钟。

示例卡片采用动态时间显示(每分钟刷新并记录日志)和模拟时钟指针旋转(每次刷新旋转30度),同时实时展示刷新次数统计。示例代码如下:

@Entry
@Component
struct DiawidgetCard {
  @State num: number = 0; // 记录刷新次数

  build() {
    Column() {
      Text(`当前刷新次数为:${this.num}`);
      TextClock()
        .onDateChange((value: number) => {
          const unixTimestamp = value;
          const milliseconds = unixTimestamp * 1000; // 转换为毫秒
          const date = new Date(milliseconds);
          // 获取时间各部分
          const year = date.getFullYear(); // 年份
          const month = date.getMonth() + 1; // 月份(0-11→1-12)
          const day = date.getDate(); // 日期
          const hours = date.getHours(); // 小时
          const minutes = date.getMinutes(); // 分钟
          console.info('当前卡片时间更新为', `${year}-${month}-${day} ${hours}:${minutes}`);
          this.num++;
        })
        // 用于控制组件是否展示
        .visibility(Visibility.Visible);
      Stack() {
        Image($r('sys.media.ohos_ic_public_clock')) // 'sys.media.ohos_ic_public_clock'仅作示例,请替换为实际使用的资源
          .width(100)
          .offset({
            x: -1,
            y: 20
          });
        Row()
          .rotate({
            x: 0,
            y: 0,
            z: 1,
            centerX: '0%',
            centerY: '100%',
            angle: this.num * 30
          })
          .width(2).height(40).backgroundColor(Color.Black);
      };
    }
    .width('100%')
    .height('100%');
  }
}

【背景知识】

  • Form Kit(卡片开发框架) 提供了一种在桌面、锁屏等系统应用上嵌入显示应用信息的开发框架和API,可以将应用内用户关注的重要信息或常用操作抽取到服务卡片(简称“卡片”)上,通过将卡片添加到桌面、锁屏等系统应用上,以达到信息展示、服务直达的便捷体验效果。
  • ArkTS卡片被动刷新:
    • 定时刷新:表示在一定时间间隔内调用onUpdateForm的生命周期回调函数自动刷新卡片内容。定时刷新有配额限制,每张卡片每天最多通过定时方式触发刷新50次。
    • 定点刷新:表示在每天的某个特定时间点自动刷新卡片内容,最多可设置24个时间。
  • TextClock组件 通过文本将当前系统时间显示在设备上。从API version 11开始,该组件支持在ArkTS卡片中使用。当时间变化时,会触发onDateChange回调,组件不可见时不回调。卡片中使用时,该事件回调间隔为分钟。

【常见FAQ】

Q:系统时钟应用可以实现秒级刷新卡片,如何实现类似效果?
A:系统时钟应用使用AnalogClock组件,该组件为系统组件,暂不对三方应用开放。

Q:非系统应用是否可以实现秒级刷新卡片?
A:受卡片系统规格约束,三方应用不支持秒级刷新卡片。对于前期突破该规则的应用,近期将进行整改。

Q:服务卡片应用主动刷新机制是否有刷新次数限制?
A:主动刷新机制目前没有次数限制。

更多关于HarmonyOS鸿蒙Next中卡片如何实现定时任务及类似时钟的年月日时分秒实时更新效果的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


请问下 知不知道市面上成熟的产品的卡片是怎么实现的呢 比如灵动小组件 我看很多卡片 很灵活,

有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html,

个人觉得是用的formmenu 动态渲染内容 可以在应用内的个人中心界面联系到应用开发者 具体咨询下,那边有开发者的联系方式

开发者手册有,

找HarmonyOS工作还需要会Flutter技术的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

其实它有两个进程,一个是App的,一个是卡片的。

在HarmonyOS Next中,卡片通过FormExtensionAbility的onUpdate回调实现定时刷新,通过配置updateDuration字段设置更新间隔(单位毫秒)。实时时钟效果可在onUpdate中更新年月日时分秒数据,并调用updateForm刷新UI。注意系统对卡片刷新频率有限制。

在 HarmonyOS Next 中,卡片即使宿主应用被强制关闭仍可实时更新,是因为卡片运行在独立的系统进程,不受应用生命周期的直接影响。实现时钟秒级更新的核心方案:

  1. FormExtensionAbilityonAddForm 回调中获取 formId,并启动一个定时器(如 setInterval,每秒执行)。
  2. 每秒调用 updateForm(formId, formBindingData),将当前时间(年、月、日、时、分、秒)作为数据推送给卡片。
  3. 卡片 UI 使用 Text 绑定传递的时间字符串,即可实现秒级刷新。

由于 FormExtensionAbility 由系统管理,即使从任务列表划掉应用,卡片进程依然存在,定时器仍能正常工作,达到时钟持续更新的效果。若需进一步降低系统开销,可结合 updateDuration(最小 30 分钟)作为保底刷新。

回到顶部