SyncManager持久保存多久?

我有一个SyncAdapter的应用程序。 除了正常的同步,我触发了一个USER_READ事件,我只是把一个Bundle传递给适配器而不需要保留它:

 Bundle settingsBundle = new Bundle(); settingsBundle.putString(SyncAdapter.USER_READ, uid); ContentResolver.requestSync(account, authority, settingsBundle); 

这将在以后的某个时候正确调用我的同步例程。 Bundle中的每个uid都会触发自己的运行,并且按预期方式进行一切同步。

如果现在连接不好,或者请求超时,那么我设置一个软错误:

 syncResult.stats.numIoExceptions += 1; 

这会导致请求稍后重复。 这也工作得很好。


这些SyncRequests / Bundle持续多久?

该文档指出,遇到软错误将导致指数退避,同步将在一段时间后运行。

  • 它会在某个时候被取消吗? 经过多次软错误?
  • 设备重启后会再次入队吗?

鉴于连接是坏的,同步失败多次软错误:我想知道是否只是排队一个同步请求就够了,或者如果我必须提供某种types的持久性,以确保请求在某个时刻发送。

Solutions Collecting From Web of "SyncManager持久保存多久?"

我不得不在Android的运行时间源挖掘一点,find你的问题的答案。 我们从问题的第一部分开始。

它会[同步]在某个时候被取消吗? 经过多次软错误?

答案可能是否定的,直到符合以下条件之一:

  • 同步被取消
  • 您要求SyncManager不要使用ContentResolver.SYNC_EXTRAS_DO_NOT_RETRY启动SyncAdapter来重新安排同步
  • 您将SyncResult.tooManyRetries设置为true并且同步不是仅上载
  • 您将SyncResult.tooManyDeletions设置为true ,请勿将SyncStats.numInsertsSyncStats.numUpdates设置为非空值,并且同步不是仅上载
  • 同步没有软错误,但有一些硬错误,它不是上传
  • 同步运行超过30分钟
  • 同步不超过1分钟使用networking

所以多个软错误不取消同步,这是为什么。

处理所有的同步事件在SyncManager.SyncHandler.handleMessage()方法中开始,并在SyncManager.runSyncFinishedOrCanceledH()方法中继续。 runSyncFinishedOrCanceledH()的第一个参数是SyncResult ,可以是null 。 当同步完成或SyncAdapter服务断开时,它不为null ,这是一个软错误。 同步取消,过期(超过30分钟),超过1分钟不使用networking,在另一种情况下,我不完全明白,它是null

如果SyncResult不为null ,同步完成并出现错误,则SyncManager尝试通过调用maybeRescheduleSync()来重新安排同步。 此方法检查一些标志和同步结果,如ContentResolver.SYNC_EXTRAS_DO_NOT_RETRYSyncResult.tooManyRetries确定是否需要重新安排同步。 并且在SyncManager检查同步完成了一个软错误syncResult.hasSoftError()它会重新同步同步,而不需要任何额外的检查。

现在是问题的第二部分。

设备重新启动后,它会再次入队吗?

是的,它会。 当SystemServer初始化时,它创buildContentService ,然后调用其systemReady()方法,从而创buildSyncManagerSyncManager在其构造函数中创buildSyncStorageEngine ,它读取构造函数中的所有挂起操作 , 包括额外的包 。 这就是为什么同步包中允许的一组types非常有限。 当用户启动时,通过调用SyncQueue.addPendingOperations()将所有挂起的操作添加到SynqQueue

这个答案是我分析Android代码的结果,所以我不能保证它是100%正确的。 但是,您可以将此信息作为您自己的研究的起点。