SyncAdapter:帐户已创建,requestSync OK,但 setSyncAutomatically 不工作

SyncAdapter: Account created, requestSync OK, but setSyncAutomatically not Working

我刚刚为我的应用程序创建了一个帐户。

我也遵循了这里的所有步骤:

这是我通过代码获取同步的代码

AccountManager am = AccountManager.get(this); 
Account[] accounts = am.getAccountsByType(ACCOUNT);
//Log.e("DEBUG", "Accounts: " + accounts.length);
if (accounts.length == 0) {
    Account account = new Account(getString(R.string.app_name), ACCOUNT);
    ContentResolver.setIsSyncable(account, AUTHORITY, 1);
    ContentResolver.addPeriodicSync(account, AUTHORITY, new Bundle(), 7200);
    ContentResolver.setSyncAutomatically(account, AUTHORITY, true);
    if (am.addAccountExplicitly(account, "pass1", null))
        Log.i("DEBUG", "account Created: " + account.name + ", " + account.type);
    else
        Log.i("DEBUG", "addAccountExplicitly returned false");
    }
else{
    ContentResolver.requestSync(accounts[0], AUTHORITY, new Bundle());// THIS IS WORKING!!!
    }
}

所以,一切看起来都正确无误。

但不幸的是,我无法获得定期同步!当我打开设置、账户时,我看到账户和日期和时间是我通过代码或手动执行同步的时间。

知道我做错了什么或忘记了什么吗?

需要记住的一件重要事情是周期性同步时间无法保证并且可能不准确,这在 documentation:

中提到

Although these sync are scheduled at the specified frequency, it may take longer for it to actually be started if other syncs are ahead of it in the sync operation queue. This means that the actual start time may drift.

我也会尝试使用 AccountManager 创建帐户,而不是通过创建 new Account()

 manager.addAccountExplicitly(account, null, null)

最后,如果这个帐户是刚刚创建的,那么您可能希望在设置自动同步设置后立即强制执行第一次同步:

 if (accountJustCreated) { 
   SyncAdapter.performSync();
 }

重写

我在 GitHub 上整理了一个示例项目,演示了一个工作的 SyncAdapter。该项目是 here.

我只在 API 17 的模拟器上尝试过此操作,因为我不想等待大约一个小时左右(现在可能更长)才能进行同步。我建议你也走这条路。

在 API 17 日,此演示将每 30 秒左右进行一次同步。所有 运行 主 activity 之外的所有东西都支持存根 类:SyncAdapter、StubProvider 等。同步适配器唯一做的就是向 logcat 记录一条消息它有 运行.

除了设置同步的调用顺序不正确之外,我真的没有发现您的代码有任何问题。查看演示中的调用顺序,了解有效的示例。

我希望你觉得这有用。

(我是在 Android Studio 3.0 Canary 5 上做的。我希望这不是问题。)