捆绑包持续多长时间由SyncManager保留?

Dav*_*jak 10 android android-syncadapter

我有一个应用程序SyncAdapter.除了正常的同步之外,我还会触发一个USER_READ事件,我只需将它传递Bundle给适配器而不保留它:

Bundle settingsBundle = new Bundle();
settingsBundle.putString(SyncAdapter.USER_READ, uid);
ContentResolver.requestSync(account, authority, settingsBundle);
Run Code Online (Sandbox Code Playgroud)

这将在将来的某个时候正确调用我的同步例程.每个uid组中的Bundle将触发其自己的运行,一切都被预期同步.

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

syncResult.stats.numIoExceptions += 1;
Run Code Online (Sandbox Code Playgroud)

这将导致请求稍后重复.这也很好用.


这些SyncRequests/Bundles持续多长时间?

该文件指出,该遇到软错误将导致exponentional补偿和同步将在以后运行一段时间.

  • 会在某个时候取消吗?多次软错误后?
  • 重启设备后会再次排队吗?

鉴于连接错误并且同步因软错误而多次失败:我想知道是否只是将同步请求排入队列,或者我是否必须自己提供某种持久性以确保在某些时候发送请求.

Mic*_*ael 7

我不得不深入挖掘Android运行时源代码以找到问题的答案.让我们从问题的第一部分开始.

是否会在某些时候取消[同步]?多次软错误后?

答案可能是否定的,直到满足下列条件之一:

  • 同步已取消
  • 你问SyncManager不开始重新安排同步SyncAdapterContentResolver.SYNC_EXTRAS_DO_NOT_RETRY
  • 您设置SyncResult.tooManyRetriestrue和同步不是仅上传
  • 您设置SyncResult.tooManyDeletionstrue,没有设置SyncStats.numInsertsSyncStats.numUpdates以非空值,并且同步是不是仅上载
  • sync没有软错误但有一些硬错误,并且它不是仅上传的
  • 同步运行超过30分钟
  • 同步不使用网络超过1分钟

因此,多个软错误不会取消同步,这就是原因.

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

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

现在是问题的第二部分.

重启设备后,它会[同步]再次入队吗?

是的,它会的.当SystemServer初始化时,它会创建ContentService,然后调用它的systemReady()方法,这反过来创建SyncManager.SyncManager在其构造函数中创建SyncStorageEngine,它在其构造函数中读取所有挂起的操作,包括额外的包.这就是同步包中允许的一组类型非常有限的原因.当用户启动时,SynqQueue通过调用添加所有待处理操作SyncQueue.addPendingOperations().

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