Android 停止同步适配器以在使用addPeriodicSync时进行初始同步
我在项目中使用的同步适配器将定期同步。要为同步适配器创建帐户,我使用以下代码 我面临的问题是,此代码正在触发初始同步。文档中没有提到此代码将使同步最初运行 事实上,即使在google示例项目中,也有额外的代码用于触发我已删除的初始同步 我使用了此示例中的代码: 即使我添加命令ContentResolver.cancelSync(account,null);同步适配器仍在运行 如何停止同步适配器的初始同步。它应该在同步间隔期结束后第一次同步Android 停止同步适配器以在使用addPeriodicSync时进行初始同步,android,android-contentresolver,android-syncadapter,Android,Android Contentresolver,Android Syncadapter,我在项目中使用的同步适配器将定期同步。要为同步适配器创建帐户,我使用以下代码 我面临的问题是,此代码正在触发初始同步。文档中没有提到此代码将使同步最初运行 事实上,即使在google示例项目中,也有额外的代码用于触发我已删除的初始同步 我使用了此示例中的代码: 即使我添加命令ContentResolver.cancelSync(account,null);同步适配器仍在运行 如何停止同步适配器的初始同步。它应该在同步间隔期结束后第一次同步 Account account = new Accou
Account account = new Account(context.getPackageName(), context.getPackageName());
AccountManager accountManager = (AccountManager) context.getSystemService(Context.ACCOUNT_SERVICE);
if (accountManager.addAccountExplicitly(account, null, null)) {
// Inform the system that this account supports sync
ContentResolver.setIsSyncable(account, context.getPackageName(), 1);
// Inform the system that this account is eligible for auto sync when the network is up
ContentResolver.setSyncAutomatically(account, context.getPackageName(), true);
// Recommend a schedule for automatic synchronization.
// The system may modify this based
// on other scheduled syncs and network utilization.
ContentResolver.addPeriodicSync(account, context.getPackageName(),
Bundle.EMPTY, AppConstants.SYNC_INTERVAL);
}
您可以在第一次手动同步后安排未来事件
private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
private void setDelayedAutoSync() {
ScheduledFuture<?> countdown = scheduler.schedule(new Runnable() {
@Override
public void run() {
Log.d(TAG, "Out of time!");
ContentResolver.setSyncAutomatically(account, content_authority, true);
ContentResolver.addPeriodicSync(account, content_authority, new Bundle(),SYNC_FREQUENCY_CONSTANT);
}, SYNC_FREQUENCY_CONSTANT, TimeUnit.SECONDS);
}
private static final ScheduledExecutorService scheduler=Executors.newScheduledThreadPool(1);
私有void setDelayedAutoSync(){
ScheduledFuture倒计时=scheduler.schedule(new Runnable()){
@凌驾
公开募捐{
Log.d(标记“超时!”);
ContentResolver.setsyncutomatically(account,content\u authority,true);
ContentResolver.addPeriodicSync(帐户、内容权限、新绑定()、同步频率常数);
},同步频率常数,时间单位。秒);
}
初始同步是显式添加帐户的结果
if (accountManager.addAccountExplicitly(account, null, null))
每当添加/删除触发同步的帐户时,同步适配器就会发送广播。请参阅SyncManager源类
可以通过在传递给onPerformSync()的包中添加一个特定的键,并检查该键是否触发同步而不是发送一个空包来避免这种情况
Bundle bundle = new Bundle();
bundle.putBoolean("MySync", true);
ContentResolver.addPeriodicSync(account, context.getPackageName(),
bundle, AppConstants.SYNC_INTERVAL);
....
onPerformSync(...) {
if(bundle.containsKey("MySync")) {
//perform your sync
}
}