如何使用Android SyncAdapter?

时间:2010-10-22 07:50:17

标签: android android-contentprovider android-syncadapter

我尝试了解Android同步逻辑。我不明白的是Android SDK示例项目syncadapter.xml中包含的文件SampleSyncAdapter。如果您下载了SDK示例,则它应位于以下文件夹中:

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

3 个答案:

答案 0 :(得分:71)

制作SyncAdapter时可以使用两种基本方法:

  1. 将数据填入现有的ContentProvider
  2. 创建您自己的ContentProvider以存储新类型的数据。
  3. 前者是这个示例应用程序中正在发生的事情。他们有一些网站有一个联系人列表,他们希望将这些联系人与设备上的其他联系人一起存储。无论哪种情况,这一切的方式都是通过三个组成部分之间的关​​系来实现的:

    1. ContentProvider,用于存储数据。
    2. SyncAdapter,与远程服务器通信以获取要放入ContentProvider的数据。
    3. Android ContentResolver,它指出如何配对SyncAdapter和ContentProviders。
    4. Android设备可以有许多不同的ContentProviders和许多不同的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 :(得分:5)

当你的APK被加载时,清单中的指令告诉操作系统审查所有元数据。在这种情况下,它是Android联系人的内容元数据。用于查找提供程序的名称是com.android.contacts(由Android定义) - 并且所有者具有“权限”以提供对其数据库(即ContentProvider)的内容访问。

N.B。您可以成为自己数据的内容提供商,可以与非联系人的网络服务同步。元数据是一种向操作系统注册的机制,因此您可以在广播消息中找到它。

此定义的元数据将通过您提供的“同步类型”与您的SyncAdapter相关联。类型的名称是android:accountType,可能是'com.mycompany.myapp'。在向所有同步适配器广播期间使用该密钥,您的编码BroadcastReceiver将处理您的类型的消息。

这是关系的开始和术语的一些细分。

答案 2 :(得分:2)

这是一种在帐户类型,同步适配器和内容管理机构之间建立关系的方法

再次回顾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我们定义的同步适配器(在包含此文件的标记的标记的name元素中调用的类将使用com.example.android同步联系人。 samplesync样式帐户。帐户类型和权限对于您的应用程序是唯一的。

您的所有contentAuthority字符串必须全部匹配,并与您正在同步的内容相匹配 - 如果您要创建自己的数据库,则应该是您定义的字符串,或者您应该使用某些现有设备字符串,如果您正在同步已知数据类型(如联系人或日历事件或您拥有的内容)。以上(&#34; com.android.contacts&#34;)恰好是联系人类型数据的ContentAuthority字符串(惊讶,惊讶。)

accountType还必须与已输入的已知帐户类型之一匹配,或者必须匹配您正在创建的帐户类型。

最后一个userVisible true表示向用户显示。