2013-08-05 28 views
0

我正在編寫一個利用Android內部日曆的應用程序。應用程序是一種特定傾向的「議程」。在Android上保存和恢復日曆應用程序的數據

我需要能夠在日曆上標記不同的顏色,以便某天某個事件上會標記一些事件。我可以做到這一點沒有問題,問題是,當我關閉應用程序時,日曆視圖中的這些顏色會丟失。

所以我需要找到一種方法來存儲有關特定事件標記日期的數據。我想到了兩種方法:一種是將我的應用程序中標記的所有事件的數據保存到內部存儲或SQLite數據庫中,或者我想過循環遍歷整個日曆並查找哪些事件屬於我的應用程序。第二種方法在我看來很慢,因爲它很難定義週期的上限和下限。

什麼是主張?還有更好的方法嗎?

回答

1

如果您的應用程序獨立於用戶的日曆活動,您可以創建一個SyncAdapter(也需要一個AccountAuthenticator),並註冊它以與android日曆事物同步。然後,作爲同步適配器,使用所需顏色創建新日曆並將其標記爲只讀;把你的事件放在那裏,他們會出現在用戶可能使用的任何日曆應用上。從您的應用程序中,只需查詢日曆中的事件,即可獲取您的活動,而無需額外的過濾。


例子和文章:還有的android doc about the calendar provider,其中介紹瞭如何訪問和修改日曆和事件。你需要這個來創建和填充你的日曆。如果您不需要認證您的應用程序,看到"Creating a Stub Authenticator",並通過編程方式創建帳戶

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以允許任何同步。

您還需要註冊一個服務產生的SyncAdapter(就像用AccountAuthenticator),在AndroidManifest.xml中:

<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" /> 

對於一般的同步適配器的東西,如何把它放在一起,有一個偉大的博客文章"write your own Android Sync Adapter"

+0

謝謝dst!通過將它們轉爲只讀,我能夠在應用程序內部更改它們嗎?我不想讓它們在我的應用程序之外進行更改,因爲它可能包含無法在外部更改的重要信息。 – filipehd

+0

您可以同步只讀日曆。我不完全確定您是否可以從應用程序中的任何位置進行更改,但是可以從同步適配器進行更改。 – dst

+0

我與CalendarProvider有點菜鳥,但這似乎是一個好主意。其實我打算這樣做,但由於缺乏經驗,我一直在使用現有的日曆之一來存儲我的活動。你知道任何網站或文章更詳細地說明你已發佈的這個解決方案嗎?非常感謝 – filipehd