ContentResolver.addPeriodicSync间隔向上舍入

时间:2015-08-11 15:17:17

标签: android intervals android-syncadapter

我的同步适配器确实能很好地工作,除了在过去的几个小时里我发现了一些小问题...对于我的应用程序我希望同步适配器以10秒的间隔运行。

ContentResolver.addPeriodicSync(mAccount, AUTHORITY, Bundle.EMPTY, 5);

同步是每隔60秒而不是请求的5秒开始。当我将interval更改为70秒时,同步每70秒开始一次。

从日志文件中:

W/ContentService﹕ Requested poll frequency of 5 seconds being rounded up to 60 seconds.

或者,为了确保ContentService占用了我的间隔,当我将间隔更改为13秒时:

W/ContentService﹕ Requested poll frequency of 13 seconds being rounded up to 60 seconds.

有人知道这次回合的原因吗?

在我的摩托罗拉XT上发生了Android 5.0.2(Api等级22)。

尝试使用模拟器Android 4.0.4(Api等级15),它只在没有日志消息的情况下执行相同操作,而不是60秒,间隔更改为30秒。所以必须有一些我不知道的限制。

谢谢,如果需要更多信息,请与我们联系。

3 个答案:

答案 0 :(得分:8)

似乎无法添加间隔小于60秒的周期同步。 (或者至少从4.4或更高。)

https://android.googlesource.com/platform/frameworks/base/+/kitkat-mr1-release/services/java/com/android/server/content/ContentService.java

if (request.isPeriodic()) {
    mContext.enforceCallingOrSelfPermission(
        Manifest.permission.WRITE_SYNC_SETTINGS,
        "no permission to write the sync settings");
    if (runAtTime < 60) {
        Slog.w(TAG, "Requested poll frequency of " + runAtTime
            + " seconds being rounded up to 60 seconds.");
        runAtTime = 60;
    }
    PeriodicSync syncToAdd =
        new PeriodicSync(account, provider, extras, runAtTime, flextime);
    getSyncManager().getSyncStorageEngine().addPeriodicSync(syncToAdd, userId);
}

答案 1 :(得分:0)

  

W / ContentService:请求的轮询频率为300秒    四舍五入到达900s。

似乎在Android 7和8上最低频率为15分钟。 直到Android 6我们有一个高达60秒的回合,这是不错的。

我还注意到我们在pollFrequency上有一个注释,即1h是最小的。

  

pollFrequency long:以秒为单位的时间量...强制执行最短1小时的时间。

这对我来说似乎很不一致。

答案 2 :(得分:0)

这里的问题是android源代码中的文档错误。

实际值是:

  
      
  • 从首先引入Froyo方法的addPeriodicSync(API 8)开始,没有最小时间间隔,即源herehere(即使在内部也是如此)重试必须等待至少30秒)。
  •   
  • KitKat(API 19)开始,最小间隔已设置为1分钟,来源为here
  •   
  • Nougat(API 24)开始,最小间隔为15分钟,来源hereherehere
  •   

其他信息:

  • 从棉花糖(API 23)开始,周期性同步频率也受打ze模式和其他操作系统电池优化的影响

PS:addPeriodicSync(...)的文档关于API 24之前的pollFrequency参数是错误的,我已经打开了issue,等待Google对其进行修复。