【问题标题】:ContentResolver.addPeriodicSync interval round upContentResolver.addPeriodicSync 间隔向上取整
【发布时间】:2018-11-16 18:45:21
【问题描述】:

我的同步适配器运行良好,除了在过去几个小时里让我大吃一惊的一件小事......对于我的应用程序,我希望同步适配器以 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.

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

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

有人知道这次围捕的原因吗?

在装有 Android 5.0.2(Api 级别 22)的摩托罗拉 XT 上发生。

在模拟器 Android 4.0.4(Api 级别 15)上进行了尝试,它仅在没有日志消息的情况下执行相同的操作,并且间隔更改为 30 秒,而不是 60 秒。所以一定有一些我不知道的限制。

谢谢,如果需要更多信息,请告诉我。

【问题讨论】:

  • 能否请您参考这个:stackoverflow.com/questions/5138256/…,可能对您有所帮助。
  • 嗨,那个对这个问题没有帮助。同步适配器的问题是它似乎不可能以 5 或 10 秒的间隔运行。
  • 如果您将其设置为不到一分钟,将会消耗大量电池电量。一分钟仍然是电池耗尽...
  • 很抱歉这个问题迟到了,但我试图就这个话题提供一个完整的答案,因为在 2018 年仍然有很多关于这个的错误(在某种程度上是由错误的文档引起的)

标签: android intervals android-syncadapter


【解决方案1】:

似乎无法添加间隔小于 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);
}

【讨论】:

    【解决方案2】:

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

    真正的价值是:

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

    附加信息:

    • 从 Marshmallow (API 23) 开始,周期性同步频率也受到打盹模式和额外的操作系统电池优化的影响

    PS:addPeriodicSync(...) 的文档关于 API 24 之前的 pollFrequency 参数有误,我打开了一个 issue 等待 Google 修复它。

    【讨论】:

      【解决方案3】:

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

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

      我还注意到我们在 pollFrequency 上有一个说明,1h 是最小值。

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

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

      【讨论】:

        猜你喜欢
        • 2016-01-11
        • 2012-01-11
        • 2015-08-06
        • 1970-01-01
        • 2015-01-09
        • 2022-01-24
        • 1970-01-01
        • 1970-01-01
        • 2021-10-29
        相关资源
        最近更新 更多