21

假设我的应用程序实现了 SyncAdapter 功能并且没有定义定期同步。在这种情况下何时会发生同步?我可能会想到的第一个场景是本地 ContentProvided/数据库内容更改。服务器变化是怎么回事?SyncAdapter 如何知道这一点?

4

1 回答 1

32

如果您没有定期同步设置,如果您的代码ContentResolver.requestSync(Account account, String authority, Bundle extras)使用您的帐户和权限显式调用,则会发生同步。

此外,如果您的 ContentProvider 插入或更新或删除函数调用ContentResolver.notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork),如果 bool syncToNetwork 为 true(默认值),它也会触发同步。这里有一个短暂的延迟,以确保一批数据库更改只导致一次同步,而不是每次更改一次。请注意,您的代码应该被调用notifyChange,因为它是 Android 在 UI 反映的内容发生更改后向您的 UI 发出更新信号的方式。

如果服务器数据库发生变化,您的应用程序不会知道,因为同步没有发生。两种选择:

  1. 使用定期同步。 如果您的服务器 API 实现了 etags 或 if-modified-since http 标头来过滤您同步的数据,那么这将更加清晰,因此只有更新才会出现。
  2. C2DM (Cloud 2 Device Messaging)本质上,Android 的推送通知。需要一些服务器组件——您将设备 ID 绑定到服务器上的帐户,并且当服务器更改时,它必须明确向设备发送消息以告知其更新。这是服务器上的自定义代码工作,专门支持 android,但是一旦你投入时间,它就很棒。C2DM 是 Android 如何在 gmail 到达您的收件箱 10 秒后显示在您的设备上,而不是在接下来的 10 分钟定期同步时显示。它的电池效率也更高,因为您只有在知道有新数据要获取时才打开收音机并进行同步
于 2011-04-04T13:16:54.333 回答