日程指特定的事件或者活动安排,日程管理即对这些事件、活动进行规划和控制。Calendar Kit中的日程Event归属于某个对应的日历账户Calendar,一个日历账户下可以有多个日程,一个日程只属于一个Calendar。

本文将详细介绍:

  • 日程管理核心接口

  • 开发步骤:权限申请、创建日程、更新日程、查询日程、删除日程

  • 日程重复规则配置

  • 一键服务功能

一、日程管理

1.1 日程与账户的关系

关系 说明
归属关系 日程归属于某个日历账户
一对多 一个日历账户下可以有多个日程
一对一 一个日程只属于一个Calendar

1.2 日程支持的信息设置

在创建、修改日程时,支持对以下相关信息进行设置:

信息项 说明
标题 日程的标题
开始时间 日程开始时间
结束时间 日程结束时间
日程类型 NORMAL、IMPORTANT等
日程地点 日程发生地点
日程提醒时间 提前多久提醒
日程重复规则 按天、按周、按月、按年重复

二、核心接口说明

接口 描述
getCalendarManager(context) 根据上下文获取CalendarManager对象
createCalendar(calendarAccount) 根据日历账户信息创建Calendar对象
addEvent(event) 创建日程,入参Event不填日程id
editEvent(event) 通过跳转到日程创建界面创建单个日程
deleteEvent(id) 删除指定日程id的日程
updateEvent(event) 更新日程
getEvents(eventFilter, eventKey) 获取Calendar下符合查询条件的Event

三、开发步骤

3.1 导入相关依赖

import { abilityAccessCtrl, AbilityConstant, common, PermissionRequestResult, Permissions, UIAbility, Want } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { calendarManager } from '@kit.CalendarKit';
import { window } from '@kit.ArkUI';
import { hilog } from '@kit.PerformanceAnalysisKit';

3.2 申请权限

module.json5中声明申请读写日历日程所需的权限:

{
  "module": {
    "requestPermissions": [
      { "name": "ohos.permission.READ_CALENDAR" },
      { "name": "ohos.permission.WRITE_CALENDAR" }
    ]
  }
}

3.3 获取日历管理器

const DOMAIN = 0x0000;
export let calendarMgr: calendarManager.CalendarManager | null = null;
export let mContext: common.UIAbilityContext | null = null;

export default class EntryAbility extends UIAbility {
  onWindowStageCreate(windowStage: window.WindowStage): void {
    windowStage.loadContent('pages/Index', (err, data) => { });
    
    mContext = this.context;
    const permissions: Permissions[] = ['ohos.permission.READ_CALENDAR', 'ohos.permission.WRITE_CALENDAR'];
    let atManager = abilityAccessCtrl.createAtManager();
    
    atManager.requestPermissionsFromUser(mContext, permissions).then(() => {
      calendarMgr = calendarManager.getCalendarManager(mContext);
    });
  }
}

3.4 创建日历账户

let calendar: calendarManager.Calendar | undefined = undefined;

// 指定日历账户信息
const calendarAccount: calendarManager.CalendarAccount = {
  name: 'MyCalendar',
  type: calendarManager.CalendarType.LOCAL,
  displayName: 'MyCalendar'
};

// 日历配置信息
const config: calendarManager.CalendarConfig = {
  enableReminder: true,  // 打开日程提醒
  color: '#aabbcc'       // 设置日历账户颜色
};

// 创建日历账户
calendarMgr?.createCalendar(calendarAccount).then((data: calendarManager.Calendar) => {
  calendar = data;
  calendar.setConfig(config);
}).catch((error: BusinessError) => {
  hilog.error(DOMAIN, 'testTag', `Failed to create calendar: ${error.code}`);
});

3.5 添加日程

方式一:通过addEvent()创建单个日程

const date = new Date();

const event: calendarManager.Event = {
  title: 'title',                                    // 日程标题
  type: calendarManager.EventType.NORMAL,            // 日程类型
  startTime: date.getTime(),                         // 开始时间
  endTime: date.getTime() + 60 * 60 * 1000,          // 结束时间(1小时后)
  reminderTime: [10],                                // 提前10分钟提醒
  // 重复规则(可选)
  recurrenceRule: {
    recurrenceFrequency: calendarManager.RecurrenceFrequency.DAILY,  // 按天重复
    count: 100,                                      // 重复次数
    interval: 2,                                     // 每隔2天重复
    expire: date.getTime() + 60 * 60 * 1000 * 3,    // 过期时间
    excludedDates: [date.getTime() + 60 * 60 * 1000 * 2]  // 排除日期
  },
  // 一键服务(可选)
  service: {
    type: calendarManager.ServiceType.TRIP,           // 服务类型
    uri: 'xxx://xxx.xxx.com/xxx',                    // DeepLink
    description: '一键服务'
  }
};

calendar.addEvent(event).then((data: number) => {
  hilog.info(DOMAIN, 'testTag', `Succeeded in adding event, id: ${data}`);
}).catch((err: BusinessError) => {
  hilog.error(DOMAIN, 'testTag', `Failed to addEvent: ${err.code}`);
});

方式二:通过editEvent()跳转日程创建界面

const eventInfo: calendarManager.Event = {
  title: 'title',
  type: calendarManager.EventType.NORMAL,
  startTime: date.getTime(),
  endTime: date.getTime() + 60 * 60 * 1000
};

calendarMgr?.editEvent(eventInfo).then((id: number) => {
  hilog.info(DOMAIN, 'testTag', `create Event id = ${id}`);
}).catch((err: BusinessError) => {
  hilog.error(DOMAIN, 'testTag', `Failed to create Event: ${err.code}`);
});

注意

  • 不推荐使用calendarManager.EventType.IMPORTANT,重要日程类型不支持一键服务跳转功能及无法自定义提醒时间

  • editEvent()不支持自定义周期性日程创建

3.6 更新日程

按照日程id进行指定日程的更新:

const updateEvent: calendarManager.Event = {
  title: 'updateTitle',
  description: 'updateEventTest',
  type: calendarManager.EventType.NORMAL,
  id: eventId,                           // 必须指定日程id
  startTime: date.getTime(),
  endTime: date.getTime() + 60 * 60 * 1000
};

calendar.updateEvent(updateEvent).then(() => {
  hilog.info(DOMAIN, 'testTag', 'Succeeded in updating event');
}).catch((err: BusinessError) => {
  hilog.error(DOMAIN, 'testTag', `Failed to update event: ${err.code}`);
});

3.7 查询日程

查询所有日程

calendar.getEvents().then((data: calendarManager.Event[]) => {
  hilog.info(DOMAIN, 'testTag', `Events: ${JSON.stringify(data)}`);
}).catch((err: BusinessError) => {
  hilog.error(DOMAIN, 'testTag', `Failed to get events: ${err.code}`);
});

根据日程id查询

const filterId = calendarManager.EventFilter.filterById([eventId]);
calendar.getEvents(filterId).then((data: calendarManager.Event[]) => {
  hilog.info(DOMAIN, 'testTag', `Events by id: ${JSON.stringify(data)}`);
}).catch((err: BusinessError) => {
  hilog.error(DOMAIN, 'testTag', `Failed to get events: ${err.code}`);
});

根据日程标题查询

const filterTitle = calendarManager.EventFilter.filterByTitle('update');
calendar.getEvents(filterTitle).then((data: calendarManager.Event[]) => {
  hilog.info(DOMAIN, 'testTag', `Events by title: ${JSON.stringify(data)}`);
}).catch((err: BusinessError) => {
  hilog.error(DOMAIN, 'testTag', `Failed to get events: ${err.code}`);
});

根据日程开始和结束时间查询

const filterTime = calendarManager.EventFilter.filterByTime(1686931200000, 1687017600000);
calendar.getEvents(filterTime).then((data: calendarManager.Event[]) => {
  hilog.info(DOMAIN, 'testTag', `Events by time: ${JSON.stringify(data)}`);
}).catch((err: BusinessError) => {
  hilog.error(DOMAIN, 'testTag', `Failed to filter by time: ${err.code}`);
});

3.8 删除日程

calendar.deleteEvent(eventId).then(() => {
  hilog.info(DOMAIN, 'testTag', 'Succeeded in deleting event');
}).catch((err: BusinessError) => {
  hilog.error(DOMAIN, 'testTag', `Failed to delete event: ${err.code}`);
});

四、日程重复规则

属性 类型 说明
recurrenceFrequency RecurrenceFrequency 重复频率:DAILY(按天)、WEEKLY(按周)、MONTHLY(按月)、YEARLY(按年)
count number 重复次数(与expire二选一,都填则按count)
interval number 重复间隔时间,与recurrenceFrequency相关
expire number 过期时间(与count二选一,都填则按count)
excludedDates number[] 排除日期,将该日期从重复日程中排除

五、一键服务功能

日程服务(service)字段用于需要一键服务功能的日程:

属性 类型 说明
type ServiceType 服务类型,如一键查看、一键入会、一键追剧等
uri string DeepLink,可以跳转到三方应用相应界面
description string 服务辅助描述信息(可选)

注意:使用DeepLink方式需要在华为HAG云侧进行注册,注册提供的信息为应用包名、应用的服务类型。

六、接口汇总

操作 接口 说明
创建日程 addEvent(event) 入参不填日程id
创建日程 editEvent(event) 跳转到日程创建界面
更新日程 updateEvent(event) 需填写日程id
删除日程 deleteEvent(id) 按日程id删除
查询所有 getEvents() -
按id查询 getEvents(filterById) -
按标题查询 getEvents(filterByTitle) -
按时间查询 getEvents(filterByTime) -

开发流程

导入依赖 + 申请权限
    ↓
获取日历管理器
    ↓
创建日历账户
    ↓
配置日历(打开提醒、设置颜色)
    ↓
创建日程(addEvent / editEvent)
    ↓
(可选)更新日程
    ↓
(可选)查询日程
    ↓
(可选)删除日程

注意事项

  1. 日程id:创建成功后返回,作为唯一标识,更新/删除时需要

  2. IMPORTANT类型:不推荐使用,不支持一键服务跳转功能及无法自定义提醒时间

  3. editEvent限制:不支持自定义周期性日程创建

  4. 权限管控:应用无法获取其他应用创建的日程信息

  5. DeepLink注册:使用一键服务需要在华为HAG云侧注册

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐