我正在尝试弄清楚 syncAdapter 的工作原理,我使用 sampleSync Adapter 作为示例/起点,并以此为基础进行了第一次测试。唯一的区别是我没有使用默认联系人提供程序,而是我需要自己的一个。
此方法与 sampleSyncAdapter 演示(在 AccountAuthenticatorActivity 中)中的方法有点相同,我刚刚添加了定期同步。
public void finishLogin(String authToken) {
Log.i(TAG, "finishLogin()");
final Account account = new Account(mUsername, "be.company.syncAdapterTest");
if(mRequestNewAccount) {
mAccountManager.addAccountExplicitly(account, mPassword, null);
ContentResolver.setIsSyncable(account, MY_AUTHORITY, 1);
Bundle params = new Bundle();
params.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, false);
params.putBoolean(ContentResolver.SYNC_EXTRAS_DO_NOT_RETRY, false);
params.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, false);
ContentResolver.addPeriodicSync(account, MY_AUTHORITY, params, 30);
ContentResolver.setSyncAutomatically(account, MY_AUTHORITY, true);
ContentResolver.requestSync(account,MY_AUTHORITY,params);
} else {
mAccountManager.setPassword(account, mPassword);
}
final Intent intent = new Intent();
intent.putExtra(AccountManager.KEY_ACCOUNT_NAME, "ACCOUNT_TEST");
intent.putExtra(AccountManager.KEY_ACCOUNT_TYPE, "be.company.syncAdapterTest");
setAccountAuthenticatorResult(intent.getExtras());
setResult(RESULT_OK, intent);
finish();
}
在 perfomSync() 方法中,我有以下方法:
@Override
public void onPerformSync(Account account, Bundle extras, String authority,
ContentProviderClient provider, SyncResult syncResult) {
Log.d(TAG, "onPerformSync() start");
// Testje
try {
final String authToken = mAccountManager.blockingGetAuthToken(account, "be.company.syncAdapterTest", NOTIFY_AUTH_FAILURE);
Log.d(TAG, SAPNetworkUtilities.getWeek(account, authToken, getRandomDate()));
} catch (OperationCanceledException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (AuthenticatorException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.d(TAG, "onPerformSync() end");
}
这里我只是调用了一个简单的 SAP webservice 并在日志中显示出来。现在我有以下两个问题:
- 当我在设置中添加我的帐户时,SYNC 不会自动启动。我需要进入帐户并选中复选框以开始同步?
- 在此示例中,同步不是每 30 秒触发一次...我是否需要在 perfomSync() 方法中添加一些内容才能让系统知道同步已完成并且可以开始下一次运行?
目前我没有在 contentProvider 中写入值,只是因为我试图弄清楚同步是如何详细工作的。
目前我正在Android模拟器上进行测试。
提前感谢您的反馈。
亲切的问候,
罗宾