如果可以接受以 Jelly Bean (API 16+) 为目标,那么使用 CUSTOM_APP_PACKAGE 是最佳解决方案。添加新日历事件时,您只需填写CUSTOM_APP_PACKAGE 和CUSTOM_APP_URI 字段(分别使用您的包名称和标识事件的URI):
ContentValues values = new ContentValues();
values.put(CalendarContract.Events.CALENDAR_ID, 1);
values.put(CalendarContract.Events.TITLE, "Check *.com");
values.put(CalendarContract.Events.DTSTART, beginTime.getTimeInMillis());
values.put(CalendarContract.Events.DTEND, endTime.getTimeInMillis());
values.put(CalendarContract.Events.EVENT_TIMEZONE, TimeZone.getDefault().getID());
values.put(CalendarContract.Events.CUSTOM_APP_PACKAGE, getPackageName());
values.put(CalendarContract.Events.CUSTOM_APP_URI, "myAppointment://1");
getContentResolver().insert(CalendarContract.Events.CONTENT_URI, values);
然后您需要指定作为 AndroidManifest.xml 的一部分(如 the documentation 解释的那样)将从日历应用程序调用以显示详细视图的 Activity,例如
<activity android:name=".ShowCalendarDetailActivity">
<intent-filter>
<action android:name="android.provider.calendar.action.HANDLE_CUSTOM_EVENT" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.item/event" />
</intent-filter>
</activity>
ShowCalendarDetailActivity 将在点击出现的按钮时启动,并将传递一个带有操作"android.provider.calendar.action.HANDLE_CUSTOM_EVENT" 的 Intent,其 URI 将是日历项 URI。
您提供的自定义 URI 在 extras 中,键为 CalendarContract.EXTRA_CUSTOM_APP_URI。
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
String myCustomUri = getIntent().getStringExtra(CalendarContract.EXTRA_CUSTOM_APP_URI);
...
}
如果您想查看日历应用构建此意图的代码,请参阅EventInfoFragment.java 中的EventInfoFragment.updateCustomAppButton()。