如何使用Android SyncAdapter?

54

我试图理解Android同步逻辑,但是我不明白的是Android SDK示例项目SampleSyncAdapter中包含的syncadapter.xml文件。如果您已经下载了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"
/>

1
请阅读此帖子中提到的文章示例项目,其中一个示例涉及last.fm应用程序,并提到了android:contentAuthority设置。 - JJD
请参考此帖子: https://androidacademic.blogspot.com/2018/06/android-sync-adapter.html - Pragnesh Ghoda シ
3个回答

72

创建SyncAdapter时,有两种基本方法:

  1. 将数据填充到现有的ContentProvider中。
  2. 创建自己的ContentProvider以存储新类型的数据。

这个示例应用程序正在使用前一种方法。他们有一个包含联系人列表的网站,并希望将其与设备上的其他联系人一起存储。无论哪种情况,这些组件间的关系始终是通过三个组件之间的关系来完成的:

  1. ContentProvider,用于存储数据。
  2. SyncAdapter,与远程服务器通信以获取要放入ContentProvider的数据。
  3. Android ContentResolver,确定如何将SyncAdapter和ContentProvider配对。

Android设备可以拥有许多不同的ContentProviders和许多不同的SyncAdapters。由于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是唯一的即可。最好的方法是在Authority中使用您域名的部分(Java类样式)。将它们按相反的顺序写入。这在他们的示例中有说明...com.android.contacts

5
当您的APK被加载时,清单中的指令告诉操作系统审查所有元数据。在这种情况下,它是Android联系人的内容元数据。用于查找提供程序的名称是com.android.contacts(由Android定义)-所有者具有“权限”来为其数据库提供内容访问(即ContentProvider)。
请注意:您可以成为自己数据的内容提供程序,该数据可以与您的Web服务同步,而不是联系人。元数据是一种机制,可在广播消息期间向操作系统注册,以便您可以找到它。
此定义的元数据将由您提供的“同步类型”与SyncAdapter相关联。类型的名称是android:accountType,可能是“com.mycompany.myapp”。该键在广播到所有同步适配器时使用,您编写的BroadcastReceiver将处理带有您类型的消息。
这是关系的开始和术语的一些解释。

安卓系统如何知道需要执行同步操作?同步操作请求在哪里? - siamii
4
您可以启用几个默认设置并定义自己的“立即同步”意图(Intents)。要进行即时同步,可以使用“ContentResolver.requestSync(account,authority,extras);”(请参阅stackoverflow上的问题https://dev59.com/_1LTa4cB1Zd3GeqPc7mb)。 Sync Adapter模型支持定期同步,{AlarmManager.INTERVAL_DAY | INTERVAL_HALF_DAY | INTERVAL_FIFTEEN_MINUTES | etc.}。同时,如果在活动同步期间发生错误,则该模型将重新进行同步。 - mobibob

2

这是一种创建账户类型、同步适配器和内容授权之间关系的方法。

再次查看AndroidManifest,Sync服务中的奇怪meta-data标签是建立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,我们定义的同步适配器(在包含此文件的<sync-adapter>标签中调用name元素的类)将使用com.example.android.samplesync样式帐户同步联系人。帐户类型和授权对于您的应用程序是唯一的。

所有contentAuthority字符串都必须匹配,并且与您正在同步的内容匹配--如果您正在创建自己的数据库,则应该是您定义的字符串,或者如果您正在同步已知数据类型(如联系人或日历事件等),则应该使用一些现有设备字符串。上面的“com.android.contacts”恰好是联系人类型数据的ContentAuthority字符串(惊喜吧)。

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

最后,userVisible true表示向用户显示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接