Android 利用內建行事曆建立事件通知 (Calendar Event)

Calendar Event

有時候你需要某個簡單的功能,但自己打造需要花費一些時間,如果能夠借用他人已經建立的功能,就能事半功倍。例如一個簡單的事件通知功能,只要借用 Android 內建的行事曆 App 就能夠達成。

但有一點要注意,因為是借力使力,所以如果沒力可借(沒有該 App),那當然就什麼事都做不成啦~~

發出對的意圖

要使用內建的 Calendar App 來建立事件通知,可以使用 Intent 來送出我們的意圖,而這個意圖要設定 Action 來告知我們想要做什麼,並且設定 Type 告知我們的 MIME 資料類型,接著 putExtra 包含想要送出的資料,程式碼大概如下:
Intent intent = new Intent(Intent.ACTION_EDIT);
intent.setType("vnd.android.cursor.item/event");
intent.putExtra("title", "This is a Title.");

Calendar Intent Helper

因為寫法還滿簡單的,而且可能很常用,所以我建立了一個 CalendarIntentHelper 類別來產生可以送出 Calendar Event 的 Intent,程式碼如下:
package com.demo.calendardemo;

import android.content.Intent;

/**
 * Calendar Intent Helper
 * @author Tony
 *
 */
public class CalendarIntentHelper {
    public static final String EVENT_BEGIN_TIME = "beginTime";
    public static final String EVENT_END_TIME = "endTime"; 
    public static final String EVENT_ALL_DAY = "allDay"; 
    public static final String EVENT_TITLE = "title"; 
    public static final String EVENT_DESCRIPTION = "description"; 
    public static final String EVENT_LOCATION = "eventLocation"; 

    private String title = "";
    private String description = "";
    private String location = "";
    private boolean allDay = false;
    private long beginTimeInMillis = 0;
    private long endTimeInMillis = 0;

    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public String getLocation() {
        return location;
    }
    public void setLocation(String location) {
        this.location = location;
    }
    public boolean isAllDay() {
        return allDay;
    }
    public void setAllDay(boolean isAllDay) {
        this.allDay = isAllDay;
    }
    public long getBeginTimeInMillis() {
        if (beginTimeInMillis == 0) {
            return System.currentTimeMillis();
        }
        return beginTimeInMillis;
    }
    public void setBeginTimeInMillis(long beginTimeInMillis) {
        this.beginTimeInMillis = beginTimeInMillis;
    }
    public long getEndTimeInMillis() {
        if (endTimeInMillis == 0) {
            return getBeginTimeInMillis() + (60 * 60 * 1000);//1 hour later
        }
        return endTimeInMillis;
    }
    public void setEndTimeInMillis(long endTimeInMillis) {
        this.endTimeInMillis = endTimeInMillis;
    }

    public Intent getIntentAfterSetting(){
        Intent intent = new Intent(Intent.ACTION_EDIT);
        intent.setType("vnd.android.cursor.item/event");
        intent.putExtra(CalendarIntentHelper .EVENT_TITLE, getTitle());
        intent.putExtra(CalendarIntentHelper .EVENT_DESCRIPTION, getDescription());
        intent.putExtra(CalendarIntentHelper .EVENT_BEGIN_TIME, getBeginTimeInMillis());
        intent.putExtra(CalendarIntentHelper .EVENT_END_TIME, getEndTimeInMillis());
        intent.putExtra(CalendarIntentHelper .EVENT_ALL_DAY, isAllDay());
        intent.putExtra(CalendarIntentHelper .EVENT_LOCATION, getLocation());

        return intent;
    }

}
使用方式如下:
//建立事件開始時間
Calendar beginTime = Calendar.getInstance();
beginTime.set(2012, 9, 19, 17, 50);

//建立事件結束時間
Calendar endTime = Calendar.getInstance();
endTime.set(2012, 9, 19, 19, 30);

//建立 CalendarIntentHelper 實體
CalendarIntentHelper calIntent = new CalendarIntentHelper();
//設定值
calIntent.setTitle("事件標題");
calIntent.setDescription("事件內容描述");
calIntent.setBeginTimeInMillis(beginTime.getTimeInMillis());
calIntent.setEndTimeInMillis(endTime.getTimeInMillis());
calIntent.setLocation("事件地點");

//全部設定好後就能夠取得 Intent
Intent intent = calIntent.getIntentAfterSetting();

//送出意圖
startActivity(intent);
如果你的裝置(手機)中只有內建的 Calendar App 就會立即開啟,如果同時有兩個可接收此 Action 的 App 則會出現清單讓你選擇,若無任何可以開啟的 App 則什麼事也不會發生。
本文網址:http://blog.tonycube.com/2012/10/androidcalendar-event.html
Tony Blog 撰寫,轉載時請註明出處及文章連結,謝謝 😀

3 則留言

  1. 請問前輩,
    如果要建立兩個不同日期時間的行事曆, 要怎麼做呢? 或者說要如何判斷第一個行事曆建立完成後, 再建立第二個行曆呢??
    謝謝!!

    回覆刪除
    回覆
    1. 第一個改為使用 startActivityForResult,
      它會在執行完後回傳資料,
      然後覆寫 onActivityResult() 方法,
      它會在 startActivityForResult 被呼叫並回傳資料時執行,
      你可以把第二個行事曆設定寫在這裡。
      我沒試過,你要自己試試看~~

      刪除

留言小提醒:
1.回覆時間通常在晚上,如果太忙可能要等幾天。
2.請先瀏覽一下其他人的留言,也許有人問過同樣的問題。
3.程式碼請先將它編碼後再貼上。(線上編碼:http://bit.ly/1DL6yog)
4.文字請加上標點符號及斷行,難以閱讀者恕難回覆。
5.感謝您的留言,您的問題也可能幫助到其他有相同問題的人。