Остановить адаптер синхронизации для первоначальной синхронизации при использовании addPeriodicSync

Я использую адаптер синхронизации в своем проекте, который будет периодически синхронизироваться. Чтобы создать учетную запись для адаптера синхронизации, я использую приведенный ниже код.

Проблема, с которой я столкнулся, заключается в том, что этот код запускает начальную синхронизацию. В документации нигде не упоминается, что этот код заставит синхронизацию запускаться изначально.

Фактически, даже в примере проекта Google есть дополнительный код для запуска начальной синхронизации, который я удалил.

Я использовал код из этого примера: http://developer.android.com/samples/BasicSyncAdapter/index.html

Даже если я добавлю команду 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);
}

person zaphod100.10    schedule 30.05.2015    source источник


Ответы (2)


Первоначальная синхронизация происходит в результате явного добавления учетной записи.

  if (accountManager.addAccountExplicitly(account, null, null))

Адаптер синхронизации отправляет широковещательную рассылку всякий раз, когда добавляется/удаляется учетная запись, которая запускает синхронизацию. Пожалуйста, обратитесь к исходному классу SyncManager.

Этого можно избежать, добавив определенный ключ в Bundle, переданный в 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
      }
    }
person Harini S    schedule 29.09.2017

Вы можете запланировать будущее событие после первой ручной синхронизации.

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);
    }
person John    schedule 21.04.2017