1

我正在编写一个使用 Android 内部日历的应用程序。该应用程序是针对特定目的的一种“议程”。

我需要能够用不同的颜色在日历上标记某一天在其上标记了一些事件。我可以做到这一点没问题,问题是,当我关闭应用程序时,我的日历视图上的这些颜色会丢失。

因此,我需要找到一种方法来存储有关已标记特定事件的日期的数据。我想到了两种方法:一种是将我的应用程序中标记的所有事件的数据保存到内部存储或 SQLite 数据库中,或者我考虑循环遍历整个日历并查找哪些事件属于我的应用程序。在我看来,第二种方法非常缓慢,因为也很难定义周期的上限和下限。

有哪些建议?还有其他更好的方法吗?

4

1 回答 1

1

如果您的应用程序独立于用户的日历事件,您可以创建一个SyncAdapter(也需要一个AccountAuthenticator),并将其注册为与 android 日历内容同步。然后,作为同步适配器,使用您想要的颜色创建一个新日历并将其标记为只读;将您的活动放在那里,它们将出现在用户可能使用的任何日历应用程序中。从您的应用程序中,只需查询日历中的事件,您就可以在不进行额外过滤的情况下获取事件。


示例和文章:关于日历提供程序的 android 文档,它描述了如何访问和修改日历和事件。您需要它来创建和填写您的日历。如果您的应用程序不需要身份验证,请参阅“创建存根验证器”,并通过编程方式创建帐户

Account account = new Account("static username, displayed to user", "your.type");
AccountManager.get(context).addAccountExplicitly(account, "", null);
ContentResolver.setSyncAutomatically(account, "com.android.calendar", true);

请记住使用单独的 xml 文件 (res/xml/yourname.xml) 注册您的同步适配器:

<?xml version="1.0" encoding="UTF-8"?>
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
              android:contentAuthority="com.android.calendar"
              android:accountType="your.type"
              android:userVisible="true"
              android:allowParallelSyncs="false"
              android:isAlwaysSyncable="true"
              android:supportsUploading="false"
/>

请注意,我添加了isAlwaysSyncable; 未设置该属性时,ContentResolver.setIsSyncable必须调用以允许任何同步。

您还需要在 AndroidManifest.xml 中注册一个生成 SyncAdapter 的服务(就像使用 一样AccountAuthenticator):

<service android:name=".package.classname" android:exported="true">
    <intent-filter>
        <action android:name="android.content.SyncAdapter" />
    </intent-filter>
    <meta-data android:name="android.content.SyncAdapter" android:resource="@xml/yourname" />
</service>
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
<!-- when distributing an AccountAuthenticator this is also required: -->
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />

对于一般同步适配器的内容以及如何将它们组合在一起,有一篇很棒的博客文章“编写你自己的 Android 同步适配器”

于 2013-08-05T21:25:07.380 回答