• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 日程管理
2
3<!--Kit: Calendar Kit-->
4<!--Subsystem: Applications-->
5<!--Owner: @qq_42718467-->
6<!--Designer: @huangxinwei-->
7<!--Tester: @z30055209-->
8<!--Adviser: @ge-yafang-->
9
10日程指特定的事件或者活动安排,日程管理即对这些事件、活动进行规划和控制,能更有效地利用相关资源、提高生产力和效率,使人们更好地管理时间和任务。
11
12Calendar Kit中的日程[Event](../reference/apis-calendar-kit/js-apis-calendarManager.md#event)归属于某个对应的日历账户[Calendar](../reference/apis-calendar-kit/js-apis-calendarManager.md#calendar),一个日历账户下可以有多个日程,一个日程只属于一个Calendar。
13
14获取到日历账户对象之后,即可对该账户下的日程进行管理,包括日程的创建、删除、修改、查询等操作。在创建、修改日程时,支持对日程的标题、开始时间、结束时间、日程类型、日程地点、日程提醒时间、日程重复规则等相关信息进行设置,以便进行更丰富更有效的日程管理。
15
16## 接口说明
17
18以下是日程管理的相关接口,更多详细接口及使用请参考[@ohos.calendarManager](../reference/apis-calendar-kit/js-apis-calendarManager.md)。
19
20| 接口名称                                      | 描述                                             |
21| ----------------------------------------- |------------------------------------------------|
22| getCalendarManager(context: Context): CalendarManager | 根据上下文获取CalendarManager对象,用于管理日历。               |
23| createCalendar(calendarAccount: CalendarAccount): Promise\<Calendar> | 根据日历账户信息,创建一个Calendar对象,使用Promise异步回调。         |
24| addEvent(event: Event): Promise\<number>  | 创建日程,入参Event不填日程id,使用Promise异步回调。              |
25| editEvent(event: Event): Promise\<number> | 通过跳转到日程创建界面创建单个日程,入参Event不填日程id,使用Promise异步回调。 |
26| deleteEvent(id: number): Promise\<void>   | 删除指定日程id的日程,使用Promise异步回调。                     |
27| updateEvent(event: Event): Promise\<void> | 更新日程,使用Promise异步回调。                            |
28| getEvents(eventFilter?: EventFilter, eventKey?: (keyof Event)[]): Promise\<Event[]> | 获取Calendar下符合查询条件的Event,使用Promise异步回调。         |
29
30## 开发步骤
31
321. 导入相关依赖。
33
34   ```ts
35   // entry/src/main/ets/entryability/EntryAbility.ets
36   import { abilityAccessCtrl, AbilityConstant, common, PermissionRequestResult, Permissions, UIAbility, Want } from '@kit.AbilityKit';
37   import { BusinessError } from '@kit.BasicServicesKit';
38   import { calendarManager } from '@kit.CalendarKit';
39   import { window } from '@kit.ArkUI';
40   ```
41
422. 申请权限。使用Calendar Kit时,需要在module.json5中声明申请读写日历日程所需的权限:`ohos.permission.READ_CALENDAR`和`ohos.permission.WRITE_CALENDAR`。具体指导可见[声明权限](../security/AccessToken/declare-permissions.md)。
43
443. 根据上下文获取日程管理器对象calendarMgr,用于对日历账户进行相关管理操作。推荐在`EntryAbility.ets`文件中进行操作。
45
46   ```ts
47   // entry/src/main/ets/entryability/EntryAbility.ets
48   export let calendarMgr: calendarManager.CalendarManager | null = null;
49
50   export let mContext: common.UIAbilityContext | null = null;
51
52   export default class EntryAbility extends UIAbility {
53     onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
54       console.info("Ability onCreate");
55     }
56
57     onDestroy(): void {
58       console.info("Ability onDestroy");
59     }
60
61     onWindowStageCreate(windowStage: window.WindowStage): void {
62       // Main window is created, set main page for this ability
63       console.info("Ability onWindowStageCreate");
64       windowStage.loadContent('pages/Index', (err, data) => {
65         if (err.code) {
66           console.error(`Failed to load the content. Code: ${err.code}, message: ${err.message}`);
67           return;
68         }
69         console.info(`Succeeded in loading the content. Data: ${JSON.stringify(data)}`);
70       });
71       mContext = this.context;
72       const permissions: Permissions[] = ['ohos.permission.READ_CALENDAR', 'ohos.permission.WRITE_CALENDAR'];
73       let atManager = abilityAccessCtrl.createAtManager();
74       atManager.requestPermissionsFromUser(mContext, permissions).then((result: PermissionRequestResult) => {
75         console.info(`get Permission success, result: ${JSON.stringify(result)}`);
76         calendarMgr = calendarManager.getCalendarManager(mContext);
77       }).catch((error: BusinessError) => {
78         console.error(`get Permission error, error. Code: ${error.code}, message: ${error.message}`);
79       })
80     }
81
82     onWindowStageDestroy(): void {
83       // Main window is destroyed, release UI related resources
84       console.info("Ability onWindowStageDestroy");
85     }
86
87     onForeground(): void {
88       // Ability has brought to foreground
89       console.info("Ability onForeground");
90     }
91
92     onBackground(): void {
93       // Ability has back to background
94       console.info("Ability onBackground");
95     }
96   }
97   ```
98
994. 根据日历账户信息创建Calendar对象,用于进行日程管理。设置日历配置信息,可以根据需要打开日程提醒、设置日历账户颜色。
100
101   ```ts
102   // Index.ets
103   import { BusinessError } from '@kit.BasicServicesKit';
104   import { calendarMgr } from '../entryability/EntryAbility';
105   import { calendarManager } from '@kit.CalendarKit';
106
107   let calendar: calendarManager.Calendar | undefined = undefined;
108   // 指定日历账户信息
109   const calendarAccount: calendarManager.CalendarAccount = {
110     name: 'MyCalendar',
111     type: calendarManager.CalendarType.LOCAL,
112     // 日历账户显示名称,该字段如果不填,创建的日历账户在界面显示为空字符串。
113     displayName: 'MyCalendar'
114   };
115   // 日历配置信息
116   const config: calendarManager.CalendarConfig = {
117     // 打开日程提醒
118     enableReminder: true,
119     // 设置日历账户颜色
120     color: '#aabbcc'
121   };
122   // 创建日历账户
123   calendarMgr?.createCalendar(calendarAccount).then((data: calendarManager.Calendar) => {
124     console.info(`Succeeded in creating calendar data->${JSON.stringify(data)}`);
125     calendar = data;
126     // 请确保日历账户创建成功后,再进行相关日程的管理
127
128     // 设置日历配置信息,打开日程提醒、设置日历账户颜色
129     calendar.setConfig(config).then(() => {
130       console.info(`Succeeded in setting config, data->${JSON.stringify(config)}`);
131     }).catch((err: BusinessError) => {
132       console.error(`Failed to set config. Code: ${err.code}, message: ${err.message}`);
133     });
134     // ...
135   }).catch((error: BusinessError) => {
136     console.error(`Failed to create calendar. Code: ${error.code}, message: ${error.message}`);
137   });
138   ```
139
1405. 在当前日历账户下添加日历日程,注意入参中不需要填写日程id。
141
142   创建日程时,支持设置日程的标题、开始时间、结束时间、日程类型、日程地点、日程提醒时间、日程重复规则等相关信息。
143
144   日程创建成功后会返回一个日程id,作为日程的唯一标识,后续可按照日程id进行指定日程的更新或删除。
145
146   目前支持以下两种方式来创建日程。
147
148   方式一:可以在日历账户下通过`addEvent()`或`addEvents()`接口创建日程。其中可使用`addEvent()`接口创建单个日程,也可以使用`addEvents()`接口批量创建日程,此处以创建单个日程为例。
149
150   方式二:在获取到日历管理器对象后,可通过`editEvent()`接口创建单个日程。调用此接口创建日程时,会跳转到日程创建页面,在日程创建页面进行相关操作完成日程的创建, `editEvent()`不支持自定义周期性日程创建。
151
152   ```ts
153   // Index.ets
154   let eventId : number | undefined = undefined;
155   const date = new Date();
156   const event: calendarManager.Event = {
157     // 日程标题
158     title: 'title',
159     // 日程类型,不推荐三方开发者使用calendarManager.EventType.IMPORTANT,重要日程类型不支持一键服务跳转功能及无法自定义提醒时间
160     type: calendarManager.EventType.NORMAL,
161     // 日程开始时间
162     startTime: date.getTime(),
163     // 日程结束时间
164     endTime: date.getTime() + 60 * 60 * 1000,
165     // 距开始时间提前10分钟提醒
166     reminderTime: [10],
167     // 日程重复规则,可选属性。如果日程为周期性日程需要填写该属性。
168     recurrenceRule: {
169       // 日程重复规则类型,支持按天、按周、按月、按年重复
170       recurrenceFrequency: calendarManager.RecurrenceFrequency.DAILY,
171       // 日程重复次数,该字段和expire属性只需要填写一个,如果两个都填写按照count属性计算。
172       count: 100,
173       // 重复日程间隔时间,与recurrenceFrequency相关,此示例表示日程每隔2天进行重复。
174       interval: 2,
175       // 日程过期时间,该字段和count属性只需要填写一个,如果两个都填写按照count属性计算。
176       expire: date.getTime() + 60 * 60 * 1000 * 3,
177       // 日程排除日期,将该日期从重复日程中排除掉
178       excludedDates: [date.getTime() + 60 * 60 * 1000 * 2]
179     },
180     // 日程服务,可选字段,需要一键服务功能的日程,填写该属性。
181     service: {
182       // 服务类型,比如一键查看、一键入会、一键追剧等。
183       type: calendarManager.ServiceType.TRIP,
184       // 服务的uri。可以跳转到三方应用相应界面,格式为DeepLink。使用DeepLink方式需要在华为HAG云侧进行注册,注册提供的信息为应用包名、应用的服务类型。
185       // DeepLink包括scheme、host、path以及参数(不包含参数值)
186       uri: 'xxx://xxx.xxx.com/xxx',
187       // 服务辅助描述信息,可选字段
188       description: '一键服务'
189     }
190
191   };
192   // 方式一
193   calendar.addEvent(event).then((data: number) => {
194     console.info(`Succeeded in adding event, id -> ${data}`);
195     eventId = data;
196   }).catch((err: BusinessError) => {
197     console.error(`Failed to addEvent. Code: ${err.code}, message: ${err.message}`);
198   });
199   // 方式二
200   const eventInfo: calendarManager.Event = {
201     // 日程标题
202     title: 'title',
203     // 日程类型
204     type: calendarManager.EventType.NORMAL,
205     // 日程开始时间
206     startTime: date.getTime(),
207     // 日程结束时间
208     endTime: date.getTime() + 60 * 60 * 1000
209   };
210   calendarMgr?.editEvent(eventInfo).then((id: number): void => {
211     console.info(`create Event id = ${id}`);
212     eventId = id;
213   }).catch((err: BusinessError) => {
214     console.error(`Failed to create Event. Code: ${err.code}, message: ${err.message}`);
215   });
216   ```
217
2186. 按照日程id进行指定日程的更新,更新日程相关信息。
219
220   ```ts
221   // Index.ets
222   const updateEvent: calendarManager.Event = {
223     title: 'updateTitle',
224     description: 'updateEventTest',
225     type: calendarManager.EventType.NORMAL,
226     id: eventId,
227     startTime: date.getTime(),
228     endTime: date.getTime() + 60 * 60 * 1000
229   };
230   calendar.updateEvent(updateEvent).then(() => {
231     console.info(`Succeeded in updating event`);
232   }).catch((err: BusinessError) => {
233     console.error(`Failed to update event. Code: ${err.code}, message: ${err.message}`);
234   });
235   ```
236
2377. 查询当前日历账户下的所有日程。由于涉及数据隐私安全,进行了权限管控的应用无法获取其他创建的日程信息。根据不同的查询条件和查询字段,返回不同的查询结果。
238
239   当没有查询条件和查询字段时,可查询指定日历账户下的所有日程。
240   ```ts
241   calendar.getEvents().then((data: calendarManager.Event[]) => {
242     console.info(`Succeeded in getting events, data -> ${JSON.stringify(data)}`);
243   }).catch((err: BusinessError) => {
244     console.error(`Failed to get events. Code: ${err.code}, message: ${err.message}`);
245   });
246   ```
247
248   还支持根据日程id、日程开始和结束时间、日程标题等查询条件来查询日程。
249   ```ts
250   // 根据日程id查询
251   const filterId = calendarManager.EventFilter.filterById([eventId]);
252   calendar.getEvents(filterId).then((data: calendarManager.Event[]) => {
253     console.info(`Succeeded in getting events, data -> ${JSON.stringify(data)}`);
254   }).catch((err: BusinessError) => {
255     console.error(`Failed to get events. Code: ${err.code}, message: ${err.message}`);
256   });
257
258   // 根据日程标题查询
259   const filterTitle = calendarManager.EventFilter.filterByTitle('update');
260   calendar.getEvents(filterTitle).then((data: calendarManager.Event[]) => {
261     console.info(`Succeeded in getting events, data -> ${JSON.stringify(data)}`);
262   }).catch((err: BusinessError) => {
263     console.error(`Failed to get events. Code: ${err.code}, message: ${err.message}`);
264   });
265
266   // 根据日程开始和结束时间查询
267   const filterTime = calendarManager.EventFilter.filterByTime(1686931200000, 1687017600000);
268   calendar.getEvents(filterTime).then((data: calendarManager.Event[]) => {
269     console.info(`Succeeded in getting events filter by time, data -> ${JSON.stringify(data)}`);
270   }).catch((err: BusinessError) => {
271     console.error(`Failed to filter by time. Code: ${err.code}, message: ${err.message}`);
272   });
273   ```
274
2758. 按照日程id进行指定日程的删除。可以通过`deleteEvent()`接口进行单个日程的删除,也可以通过`deleteEvents()`接口批量删除指定日程,此处以删除单个指定日程为例。
276
277   ```ts
278   // Index.ets
279   calendar.deleteEvent(eventId).then(() => {
280      console.info("Succeeded in deleting event");
281    }).catch((err: BusinessError) => {
282      console.error(`Failed to delete event. Code: ${err.code}, message: ${err.message}`);
283   });
284   ```
285