SyncAdapter:已创建帐户,requestSync确定,但setSync自动无法正常工作

时间:2017-05-22 14:58:58

标签: android account android-syncadapter

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

  • 该帐户在设置中可见
  • 我在XML
  • 中设置了syncable =“true”
  • 我可以通过按设置执行手动同步 - > onPerformSync 被称为
  • 我可以通过调用ContentResolver.requestSync执行“代码”同步 - > onPerformSync被称为
  • 当然,是的,在设置中启用了同步。我没有使用任何节电器。

我也遵循了这里的所有步骤:https://stackoverflow.com/a/5255360/327402

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

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!!!
    }
}

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

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

关于我做错了什么,或者我忘记了什么?

2 个答案:

答案 0 :(得分:2)

<强>重写

我已经在GitHub上组建了一个示例项目,演示了一个有效的SyncAdapter。该项目是here

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

在API 17上,此演示将每30秒左右进行一次同步。使用存根支持类的所有内容都耗尽了主要活动:SyncAdapter,StubProvider等。同步适配器唯一能做的就是将消息记录到已运行的logcat。

除了设置同步的调用顺序可能不正确之外,我还没有发现您的代码有任何问题。请查看演示中的呼叫顺序,以获取有效的示例。

我希望你觉得这很有用。

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

答案 1 :(得分:0)

要记住的一件重要事情是,周期性同步时间无法保证,可能不准确,documentation中提到了这一点:

  

虽然安排了这些同步   在指定的频率,实际可能需要更长的时间   如果在同步操作队列中其他同步位于其前面,则启动。   这意味着实际开始时间可能会漂移。

我还尝试使用AccountManager创建帐户,而不是创建new Account()

 manager.addAccountExplicitly(account, null, null)

最后,如果刚刚创建了此帐户,您可能只想在设置自动同步设置后立即强制执行第一次同步:

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