Cha*_*mor 9 android android-syncadapter
概观
我使用了Google的使用SyncAdapter 的教程而不使用ContentProvider,Authenticator ..等.onPerformSync(...)当我需要通过de SyncAdapter"上传"到服务器时,它可以正常工作.
现在,正如您可以想象的那样,我也需要从服务器下载(是的,我知道使用Google的Cloud Messaing系统会更好,但这是我给出的设置,我不能改变它).为此,我想利用"网络痒"Android系统在有网络可用的情况下进行定期同步.为此,我声明如下:
ContentResolver.setIsSyncable(accounts[0], AUTHORITY, 1);
ContentResolver.setSyncAutomatically(accounts[0], AUTHORITY, true);
Run Code Online (Sandbox Code Playgroud)
但是我的SyncAdapter 没有被调用.查看其他stackOverFlow问题,如果使用SyncAdapter定位API 10或更低版本似乎存在问题,并且必须在调用before方法之前显式添加帐户.所以我最终得到了这个:
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);
}
Run Code Online (Sandbox Code Playgroud)
现在,当用户登录时,或者如果应用程序被杀死并再次启动,则会执行此代码.我想知道,我应该打电话setIsSyncable,setSyncAutomatically只有当我第一次添加dummyAccount时?
此外,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();
}
Run Code Online (Sandbox Code Playgroud)
如您所见,根据我上传到服务器的结果,我打开或关闭定期同步.
由于 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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1181 次 |
| 最近记录: |