SyncAdapter未被调用"网络痒"

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)

如您所见,根据我上传到服务器的结果,我打开或关闭定期同步.

Tin*_*ran 0

由于 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)