我尝试了解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"
/>
答案 0 :(得分:71)
制作SyncAdapter时可以使用两种基本方法:
前者是这个示例应用程序中正在发生的事情。他们有一些网站有一个联系人列表,他们希望将这些联系人与设备上的其他联系人一起存储。无论哪种情况,这一切的方式都是通过三个组成部分之间的关系来实现的:
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表示向用户显示。