概览
我关注了Google's tutorial在不使用 ContentProvider、Authenticator 等的情况下使用 SyncAdapter。当我需要通过 de SyncAdapter 向服务器“上传”时,调用 onPerformSync(...)
时效果很好。
现在,如您所想,我还需要从服务器下载(是的,我知道使用 Google 的 Cloud Messaing 系统会更好,但这是给我的设置,我可以'不要改变它)。为此,我不想定期同步,而是想利用 Android 系统在有可用网络时执行的“网络挠痒痒”。为此,我声明如下:
ContentResolver.setIsSyncable(accounts[0], AUTHORITY, 1);
ContentResolver.setSyncAutomatically(accounts[0], AUTHORITY, true);
但是我的 SyncAdapter 只是没有被调用。查看其他 stackOverFlow 问题,如果使用 SyncAdapter 定位 API 10 或更低版本似乎存在问题,并且您必须显式添加一个帐户之前调用之前的方法。所以我最终得到了这个:
AccountManager accountManager = (AccountManager) context.getSystemService(ACCOUNT_SERVICE);
Account[] accounts = accountManager.getAccounts();
if(accounts.length == 0){ //ADD DUMMY ACCOUNT
Account newAccount = new Account(ACCOUNT, ACCOUNT_TYPE);
ContentResolver.setIsSyncable(accounts[0], AUTHORITY, 1);
ContentResolver.setSyncAutomatically(accounts[0], AUTHORITY, true);
accountManager.addAccountExplicitly(newAccount, null, null);
}else{
accounts = accountManager.getAccounts();
ContentResolver.setIsSyncable(accounts[0], AUTHORITY, 1);
ContentResolver.setSyncAutomatically(accounts[0], AUTHORITY, true);
}
现在这段代码会在用户登录时执行,或者如果应用程序被终止并再次启动。我想知道,是否应该只在第一次添加 dummyAccount 时调用 setIsSyncable
和 setSyncAutomatically
?
此外,SyncAdapter 的部分“优点”是它会在出现异常时继续进行调用。但我不太明白这是怎么回事,所以我有这个:
private void profileUpdate(){
TableAccounts db = TableAccounts.getInstance(getContext());
boolean isRecordDirty = db.isRecordDirty(signedInUser);
if(isRecordDirty){
if(server.upDateUserProfile(signedInUser)){
db.cleanDirtyRecord(signedInUser);
turnOffPeriodicSync();
}else{
this.turnOnPeriodicSync(this.sync_bundle);
}
}else
turnOffPeriodicSync();
}
如您所见,根据我上传到服务器的结果,我打开或关闭了定期同步。
最佳答案
由于 accountManager.getAccounts[] 返回设备上的每个帐户,我认为没有什么能保证 account[0] 是您应用程序的帐户(也就是,具有您的包名称的 ACCOUNT_TYPE)。 -- 您可以在任何情况下调用 addAccountExplicitly(),如果它存在,则什么也不会发生。
Account account = new Account(ACCOUNT, ACCOUNT_TYPE);
AccountManager accountManager = (AccountManager) context.getSystemService(Context.ACCOUNT_SERVICE);
accountManager.addAccountExplicitly(account, null, null)
context.getContentResolver().setSyncAutomatically(account, AUTHORITY, true);
关于android - 未在 "Network tickle"上调用 SyncAdapter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22622364/