定期同步从不触发

Periodic Sync never triggering

我正在使用 SyncAdapter 进行一些服务器客户端同步。在 official android developer guide 中提到有不同的方法来触发同步。

1 运行服务器数据变化时的Sync Adapter

您只需拨打:

ContentResolver.requestSync(ACCOUNT, AUTHORITY, null);

当服务器数据发生变化时(例如在 GCM 上)。

2 运行 Content Provider 数据变化时的 Sync Adapter

只需使用 ContentObserver

public class TableObserver extends ContentObserver {
    @Override
    public void onChange(boolean selfChange) {
        onChange(selfChange, null);
    }

    @Override
    public void onChange(boolean selfChange, Uri changeUri) {
        ContentResolver.requestSync(ACCOUNT, AUTHORITY, null);
    }
}

3 运行 网络消息后的同步适配器

执行以下操作:

ContentResolver.setSyncAutomatically(ACCOUNT, AUTHORITY, true)

现在,每当有一个打开的 TCP/IP 连接时,都会触发 SyncAdapter 以执行同步。

4 运行 定期同步适配器

这对我来说是重要且有趣的部分。为此,您只需要这样做(至少这是写在开发人员指南中的):

public static final long SECONDS_PER_MINUTE = 60L;
public static final long SYNC_INTERVAL_IN_MINUTES = 60L;
public static final long SYNC_INTERVAL = SYNC_INTERVAL_IN_MINUTES * SECONDS_PER_MINUTE;

ContentResolver.addPeriodicSync(
            ACCOUNT,
            AUTHORITY,
            Bundle.EMPTY,
            SYNC_INTERVAL);

现在进入问题

解决方案 1、2 和 3 可以正常工作。定期同步没有。如果我只是按照第 4 点所述进行操作,则永远不会触发同步(是的,我确实在 android 设备的系统设置中启用了自动同步)。

如果我执行以下操作:

ContentResolver.setIsSyncable(account, ContentProviderMeasure.AUTHORITY, 1);
ContentResolver.setSyncAutomatically(account, ContentProviderMeasure.AUTHORITY, true);
ContentResolver.addPeriodicSync(account, ContentProviderMeasure.AUTHORITY, new Bundle(), 3600);

SyncAdapter 同步刷新每分钟调用一次(应该是每小时 / 3600 秒 = 1 小时)。如果我执行以下操作:

ContentResolver.setIsSyncable(account, ContentProviderMeasure.AUTHORITY, 1);
ContentResolver.addPeriodicSync(account, ContentProviderMeasure.AUTHORITY, new Bundle(), 3600);

同步只会在创建时触发一次,之后就不会再触发。是的,正如我已经提到的,android 设备设置中的自动同步已启用。

在 android 设备设置帐户管理器中为我的应用程序手动触发同步工作正常。

为什么周期性同步不起作用?

我在 Android 6.0 的 Nexus 4 上,Android 4.4 的 Galaxy Ace 和 Android 4.1 的 Galaxy S3 Mini 上进行了测试。所有设备都没有定期同步。

我已经为 Calendar AUTHORITY.

实施了 Periodic Sync

在 Manifest 文件中添加 <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" /> 权限。

为同步添加以下方法:

public void syncAllAccountsPeriodically(Context contextAct, long seconds) throws Exception {
    AccountManager manager = AccountManager.get(contextAct);
    Account[] accounts = manager.getAccountsByType("com.google");
    String accountName = "";
    String accountType = "";
    for (Account account : accounts) {
        accountName = account.name;
        accountType = account.type;
        break;
    }

    Account a = new Account(accountName, accountType);
    ContentResolver.addPeriodicSync(a, "com.android.calendar", new Bundle(), seconds*1000);
}

希望对您有所帮助。