在 Android 中向日曆提供者添加事件時,使用 Events.RRULE 字段設置重複規則,需遵循 RFC 5545 (iCalendar) 標準格式。
values.put(Events.RRULE, "FREQ=WEEKLY;WKST=SU;BYDAY=SA"); // 每週六重複
// 需求:每 3 天重複一次
// 每 3 天重複一次
values.put(Events.RRULE, "FREQ=DAILY;INTERVAL=3");
| 參數 | 含義 | 示例 |
|---|---|---|
| FREQ | 頻率類型 | DAILY、WEEKLY、MONTHLY、YEARLY、SECONDLY、MINUTELY、HOURLY |
| INTERVAL | 間隔倍數 | INTERVAL=3 表示每 3 個 FREQ 單位 |
| COUNT | 重複次數 | COUNT=10 表示重複 10 次後結束 |
| UNTIL | 結束日期時間 (UTC) | UNTIL=20231231T235959Z |
| BYDAY | 週幾 (周頻率用) | BYDAY=MO,WE,FR (周一三五) |
| BYMONTHDAY | 月幾號 (月頻率用) | BYMONTHDAY=1,15 (每月 1 號、15 號) |
| WKST | 週起始日 | WKST=MO (週一開始) |
// 每天重複
"FREQ=DAILY"
// 每 3 天重複 (本需求)
"FREQ=DAILY;INTERVAL=3"
// 每週一、三、五重複
"FREQ=WEEKLY;BYDAY=MO,WE,FR"
// 每月 1 號和 15 號重複
"FREQ=MONTHLY;BYMONTHDAY=1,15"
// 每年 12 月 25 日重複
"FREQ=YEARLY;BYMONTH=12;BYMONTHDAY=25"
// 工作日重複 (排除週末)
"FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR"
// 重複 10 次後結束
"FREQ=DAILY;INTERVAL=3;COUNT=10"
// 直到 2024 年底結束
"FREQ=DAILY;INTERVAL=3;UNTIL=20241231T235959Z"
ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
long startMillis = System.currentTimeMillis(); // 現在開始
values.put(Events.DTSTART, startMillis);
values.put(Events.DURATION, "P1800S"); // 持續 30 分鐘 (ISO 8601)
values.put(Events.TITLE, "每 3 天提醒");
values.put(Events.DESCRIPTION, "定期檢查任務");
values.put(Events.CALENDAR_ID, calId); // 目標日曆 ID
values.put(Events.EVENT_TIMEZONE, TimeZone.getDefault().getID());
values.put(Events.RRULE, "FREQ=DAILY;INTERVAL=3"); // 核心:每 3 天
Uri uri = cr.insert(Events.CONTENT_URI, values);
long eventId = Long.parseLong(uri.getLastPathSegment());
Log.d("Calendar", "事件創建成功 ID: " + eventId);
DTSTART 決定首次發生時間,重複基於此時間計算DURATION 使用 ISO 8601 格式:PnYnMnDTnHnMnS (如 PT30M 30 分鐘,P1D 1 天)WRITE_CALENDAR 權限:<uses-permission android:name="android.permission.WRITE_CALENDAR" />使用第三方庫簡化操作,如 CalendarLib 或自行封裝 Builder 模式。