我刚为我的应用创建了一个帐户。
我也遵循了这里的所有步骤: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!!!
}
}
所以,一切看起来都很正确。
但不幸的是,我不能定期同步!当我打开设置,帐户时,我看到帐户,日期和时间是我通过代码或手动执行同步的时间。
关于我做错了什么,或者我忘记了什么?
答案 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();
}