2010-10-22 66 views
51

我嘗試瞭解Android同步邏輯。我不明白的是Android SDK示例項目SampleSyncAdapter中包含的文件syncadapter.xml。如果下載了SDK的樣品應當在以下文件夾:如何使用Android SyncAdapter?

SDK/android-sdk-PLATFORM/samples/android-VERSION/SampleSyncAdapter/res/xml/syncadapter.xml 

我看了,內容提供商的權威應該是一個字符串或者對資源的引用。內容權威究竟是什麼,com.android.contacts在哪裏?這裏是文件的內容(沒有許可證信息和評論,API級別16)。

<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android" 
    android:contentAuthority="com.android.contacts" 
    android:accountType="com.example.android.samplesync" 
    android:supportsUploading="false" 
    android:userVisible="true" 
/> 
+1

請閱讀**文章**並查看**示例項目**中提到[本文](http://stackoverflow.com/questions/1859241/own-sync-adapter-for-android/ 7795266)。其中一個例子處理last.fm應用程序,並提到了android:contentAuthority設置。 – JJD 2012-08-04 16:31:29

回答

4

當您的APK被加載時,清單中的指令會告訴操作系統檢查所有元數據。在這種情況下,它是Android聯繫人的內容元數據。用於查找提供者的名稱是com.android.contacts(由Android定義) - 並且所有者擁有「權限」來提供對其數據庫(即ContentProvider)的內容訪問權限。

N.B.您可能是您自己的數據的內容提供商,可以與您的非聯繫人的網絡服務同步。元數據是一種向操作系統註冊的機制,所以您可以在廣播消息中找到它。

由於您提供的「同步類型」,此定義的元數據將與您的SyncAdapter關聯。類型的名稱是android:accountType,可能是'com.mycompany.myapp'。在向所有同步適配器廣播過程中使用該密鑰,並且您的編碼的BroadcastReceiver將使用您的類型處理消息。

這是關係的開始和術語的一些分解。

+0

android系統如何知道應該執行同步。請求的同步在哪裏? – siamii 2011-02-28 22:31:28

+4

您可以啓用一些默認設置,您可以定義自己的「同步」意圖(意圖)。要立即同步,您可以「ContentResolver.requestSync(account,authority,extras);」 (檢查SO問題http://stackoverflow.com/questions/4465765/how-to-code-a-sync-now-operation-on-android)。同步適配器模型支持定期同步,{AlarmManager.INTERVAL_DAY | INTERVAL_HALF_DAY | INTERVAL_FIFTEEN_MINUTES |等等。}。另外,如果在主動同步過程中出現錯誤,模型將重新同步。 – mobibob 2011-04-02 20:51:37

70

有製作SyncAdapter時,你可以使用兩種基本方法:

  1. 數據填充到一個現有的ContentProvider
  2. 創建您自己的ContentProvider以存儲新類型的數據。

前者在這個示例應用中發生了什麼。他們有一些擁有聯繫人列表的網站,他們希望將這些聯繫人與其他聯繫人一起存儲在設備上。在這兩種情況下,這一切工作的方式是通過三個組成部分之間的關​​系:

  1. ContentProvider的,存儲的數據。
  2. SyncAdapter,與遠程服務器通信以獲取要放入ContentProvider的數據。
  3. Android ContentResolver,它計算出如何配對SyncAdapter和ContentProviders。

Android設備可以有許多不同的ContentProvider和許多不同的SyncAdapter。由於ContentResolver可能不是作爲SyncAdapter的同一.apk的一部分,因此ContentResolver是一種系統服務,它可以找到正確的ContentProvider來存儲給定類型的數據。它使用ContentAuthority字符串執行此操作,該字符串唯一標識一個特定的ContentProvider。此外,每個ContentProvider必須在AndroidManifest.xml中聲明,以確保它可以被ContentResolver找到。在此聲明中,您可以指定ContentProvider是否可以被其他應用程序使用,請參閱:android:exported

<provider 
    android:name=".CustomProvider" 
    android:authorities="com.example.app.provider" 
    android:exported="false" 
    android:multiprocess="true" > 
</provider> 

在這種情況下,使用現有的ContentProvider,則需要看平臺文檔,以瞭解他們使用什麼ContentAuthority字符串,並使用相同的字符串。如果您要創建自己的ContentProvider,則只需確保您創建的ContentAuthority是唯一的。做到這一點的最好方法是在管理局中使用部分域名(java類風格)。以相反的順序寫入它們。這在他們的例子中說明... com.android.contacts

1

這是創建一個帳戶類型,同步適配器和內容授權

在AndroidManifest再回首之間關係的方式,即在同步服務陌生的元數據標籤是建立綁定的關鍵部分ContentAuthority和帳戶之間。它外部參考另一個XML文件(叫它任何你喜歡的,有關您的應用程序的東西。)

讓我們來看看sync_myapp.xml:

<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android" 
    android:contentAuthority="com.android.contacts" 
    android:accountType="com.example.android.samplesync" 
    android:supportsUploading="false" 
    android:userVisible="true" /> 

它告訴Android同步適配器我們定義(在包含此文件的標記的標記名稱元素中調用的類將使用com.example.android.samplesync樣式帳戶同步聯繫人。帳戶類型和權限對於您的應用程序是唯一的。

你所有的contentAuthority字符串都必須匹配,並且與你正在同步的內容匹配 - 這應該是一個字符串y如果要創建自己的數據庫,或者如果要同步已知數據類型(如聯繫人或日曆事件或您有什麼),則應該使用一些現有的設備字符串。上述(「com.android.contacts」 )碰巧是聯繫人類型數據的ContentAuthority字符串(驚喜,驚喜)。

accountType還必須匹配已經輸入的那些已知帳戶類型之一,或者它必須與您創建的帳戶類型匹配。

最後一個userVisible true表示向用戶顯示。