Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 停止同步适配器以在使用addPeriodicSync时进行初始同步_Android_Android Contentresolver_Android Syncadapter - Fatal编程技术网

Android 停止同步适配器以在使用addPeriodicSync时进行初始同步

Android 停止同步适配器以在使用addPeriodicSync时进行初始同步,android,android-contentresolver,android-syncadapter,Android,Android Contentresolver,Android Syncadapter,我在项目中使用的同步适配器将定期同步。要为同步适配器创建帐户,我使用以下代码 我面临的问题是,此代码正在触发初始同步。文档中没有提到此代码将使同步最初运行 事实上,即使在google示例项目中,也有额外的代码用于触发我已删除的初始同步 我使用了此示例中的代码: 即使我添加命令ContentResolver.cancelSync(account,null);同步适配器仍在运行 如何停止同步适配器的初始同步。它应该在同步间隔期结束后第一次同步 Account account = new Accou

我在项目中使用的同步适配器将定期同步。要为同步适配器创建帐户,我使用以下代码

我面临的问题是,此代码正在触发初始同步。文档中没有提到此代码将使同步最初运行

事实上,即使在google示例项目中,也有额外的代码用于触发我已删除的初始同步

我使用了此示例中的代码:

即使我添加命令ContentResolver.cancelSync(account,null);同步适配器仍在运行

如何停止同步适配器的初始同步。它应该在同步间隔期结束后第一次同步

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
      }
    }