我如何使用Android SyncAdapter?

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

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

我读过,内容提供者的权威应该是一个string或对资源的引用。 什么是内容权威, 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" /> 

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

  1. 将数据填充到现有的ContentProvider中 。
  2. 创build您自己的ContentProvider来存储新的数据types。

前者是这个例子中的应用程序正在发生什么。 他们有一些网站有联系人列表,他们希望将这些联系人与设备上的其他联系人一起存储。 在这两种情况下,这一切的作用是通过三个组件之间的关系:

  1. 一个ContentProvider,它存储数据。
  2. SyncAdapter,与远程服务器通信以获取要放入ContentProvider的数据。
  3. Android ContentResolver,它指出如何配对SyncAdapter和ContentProviders。

Android设备可以有许多不同的ContentProvider和许多不同的SyncAdapter。 由于ContentResolver可能不是与SyncAdapter相同的.apk的一部分,因此ContentResolver是一个系统服务,它可以find正确的ContentProvider来存储给定types的数据。 它使用ContentAuthoritystring来完成此操作,该string唯一标识一个特定的ContentProvider。 而且,每个ContentProvider都必须在AndroidManifest.xml中声明,以确保ContentResolver能够find它。 在此声明中,您可以指定ContentProvider是否可以被其他应用程序使用,请参阅: android:exported

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

在这种情况下,使用现有的ContentProvider,您需要查看平台文档以查看它们使用的ContentAuthoritystring,并使用相同的string。 如果您正在创build自己的ContentProvider,则只需确保您创build的ContentAuthority是唯一的。 做到这一点的最好方法是在pipe理局中使用你的域名(Java类风格)的一部分。 以相反的顺序写下来。 这是在他们的例子… com.android.contacts

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

注意你可能是你自己的数据的内容提供者,可以与你的networking服务同步,而不是联系人。 元数据是一种向操作系统注册的机制,所以您可以在广播消息中find它。

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

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

这是创build帐户types,同步适配器和内容授权机构之间关系的一种方法

再次回顾一下AndroidManifest,Sync服务中的奇怪的元数据标签是build立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样式帐户同步联系人。types和权限是您的应用程序的唯一。

所有的contentAuthoritystring必须全部匹配,并与您正在同步的内容匹配 – 如果您要创build自己的数据库,则应该是您定义的string;如果您正在同步已知数据库,则应该使用一些现有的设备string数据types(如联系人或日历事件或你有什么)。上述(“com.android.contacts”)碰巧是联系人types数据的ContentAuthoritystring(惊喜,惊喜)。

accountType还必须匹配已经input的已知帐户types之一,或者必须匹配您正在创build的帐户types。

最后一个userVisible true表示给用户。