安卓同步适配器什么时候运行同步?

21

假设我的应用程序实现了SyncAdapter功能,但没有定义定期同步。在这种情况下,同步会在什么时候发生?我可以考虑的第一种情况是本地ContentProvided/数据库内容更改。

那么如果是服务器端发生更改呢?SyncAdapter如何知道?

1个回答

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

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

如果服务器数据库发生更改,则您的应用程序将不知道,因为未发生同步。 有两个选项:

  1. 使用定期同步。 如果您的服务器 API 实现了 ETags 或 if-modified-since HTTP 标头以过滤您同步的数据,那么这将更加清洁。
  2. C2DM(云端到设备消息传递):实际上是 Android 的推送通知。需要一些服务器组件。您需要在服务器上将设备 ID 与帐户绑定,当服务器更改时,必须明确地向设备发送消息以告诉它更新。这是特定于 Android 的自定义代码工作,但一旦您投入时间,它就非常好用了。C2DM 是 Android 如何使 Gmail 在您的收件箱中到达 10 秒后就在您的设备上显示,而不是在下一个 10 分钟的定期同步时才出现的方式。它还更省电,因为只有在 知道 有新数据可获取时才会打开无线电和同步。

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