53

我尝试了解 Android 同步逻辑。我不明白的是syncadapter.xmlAndroid SDK 示例项目中包含的文件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"
/>
4

3 回答 3

72

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

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

前者是此示例应用程序中发生的事情。他们有一些网站,其中包含联系人列表,并且他们希望将这些联系人与设备上的其他联系人一起存储。在任何一种情况下,这一切的工作方式都是通过三个组件之间的关系:

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

一个 Android 设备可以有许多不同的 ContentProviders 和许多不同的 SyncAdapter。由于 ContentResolver 可能与 SyncAdapter 不是同一个.apk的一部分,因此ContentResolver 是一种系统服务,可以找到正确的 ContentProvider 来存储给定类型的数据。它使用 ContentAuthority 字符串执行此操作,该字符串唯一标识一个特定的 ContentProvider。此外,必须在AndroidManifest.xml其中声明每个 ContentProvider,以确保 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......

于 2011-03-02T16:24:21.060 回答
5

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

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

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

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

于 2010-12-22T02:07:52.813 回答
2

它是一种在 Account-type、Sync Adapter 和 Content Authority 之间创建关系的方法

再次回顾 AndroidManifest,Sync 服务中那个奇怪的元数据标签是建立 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 字符串必须全部匹配,并且与您正在同步的内容相匹配——如果您正在创建自己的数据库,这应该是您定义的字符串,或者如果您正在同步已知的,您应该使用一些现有的设备字符串数据类型(如联系人或日历事件或你有什么。)上面的(“com.android.contacts”)恰好是联系人类型数据的 ContentAuthority 字符串(惊喜,惊喜。)

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

Last userVisible true 表示向用户显示。

于 2014-06-25T10:34:48.700 回答