15

SyncAdapterアプリ用の と、アプリAccountManagerアカウントを Android アカウント マネージャーに追加する があります。アカウント マネージャーにアカウントを追加するときのコードは次のようになります。

Bundle data = new Bundle(5);
data.putString(_PEOPLE_ID, people_id);
data.putString(_FIRST_NAME, first_name);
data.putString(_LAST_NAME, last_name);
data.putString(_PLAN, plan);
data.putString(_BIRTHDAY, birthday);
Account account = new Account(username, _ACCOUNT_TYPE);
try {
    boolean created;
    created = _account_manager.addAccountExplicitly(account,
                                   _cryptography.encrypt(_SEED, password), data);
    response.accountCreated(created);
    _account_manager.setAuthToken(account, _TOKEN_TYPE, session_token);
    _model.updateActiveAccount(people_id, username, password);
    SharedPreferences.Editor settings = _settings.edit();
    settings.putString(_ACCOUNT_TYPE, account.name);
    settings.putString(_TOKEN_TYPE, session_token);
    settings.commit();
    // Tells the content provider that it can sync this account
    ContentResolver.setIsSyncable(account, AUTHORITY, 1);
    final Bundle extras = new Bundle(1);
    extras.putBoolean(SYNC_EXTRAS_INITIALIZE, true);
    ContentResolver.addPeriodicSync(account, AUTHORITY, extras, 900);
} catch (Exception e) {
    Ln.e(e.getCause());
}

設定からアカウント マネージャーにアカウントを正常に追加できますが、エミュレーターでバックグラウンド データと自動同期設定が有効になっている場合でも、設定でアカウントの同期を手動で有効にする必要があります。手動で同期を有効にすると、同期は正常に実行されますが、デフォルトでは開始されません。

4

4 に答える 4

30
ContentResolver.setIsSyncable(account, AUTHORITY, 1);
ContentResolver.setSyncAutomatically(account, AUTHORITY, true);

Blehiが言ったように、グローバル設定が与えられると、指定されたアカウントの自動同期が開始され、「バックグラウンド データ」と「自動同期」が有効になります。

( jcwenger からの)バックツーバック同期を防ぐには、SyncAdapter.onPerformSync(...)呼び出しのいずれかのメソッドが 通知にフラグを立てて同期呼び出しをトリガーしないようにする場合 (3 番目のパラメーターは です) を確認してください。ContentResolver.notifyChange(...)ContentResolver.notifyChange(uri, observer, false)syncToNetwork

を使用しContentProviderて挿入/削除/更新を実行している場合は、アプリが表示されている間、ユーザーが から更新を受信できるようSyncAdapterに呼び出すのが理にかなっています。つまり、呼び出しを行うことができます。この設定を機能させるために、(開発ガイドに従って)クエリ パラメーターを、. このメソッドを に追加して、着信 URI をテストします。ContentResolver.notifyChange(...)SyncAdapterContentProviderContentResolver.notifyChange(...)CALLER_IS_SYNC_ADAPTERSyncAdapterContentProvider

/**
 * Determines if the given URI specifies that the request is coming from the sync adapter.
 * @param uri the given URI
 * @return true if the uri specifies that the request is coming from the sync adapter
 */
private boolean callerIsSyncAdapter(Uri uri) {
    final String is_sync_adapter = uri.getQueryParameter(CALLER_IS_SYNC_ADAPTER);
    return is_sync_adapter != null && !is_sync_adapter.equals("0");
}  

それからあなたはすることができます

getContext().getContentResolver().notifyChange(uri, observer, !callerIsSyncAdapter(uri));

変更通知を送信する必要があるときはいつでも。

また、同期を一定の頻度で定期的に実行するようにスケジュールする場合 (サーバーのポーリング)、これをContentResolver.setSyncAutomatically(...)呼び出しに追加します。

ContentResolver.addPeriodicSync(account, AUTHORITY, new Bundle(), frequency_in_seconds)
于 2012-06-19T18:24:48.227 に答える
6

アカウントをデフォルトで同期可能に設定する必要があります。

ContentResolver.setIsSyncable(account, AUTHORITY, 1);
ContentResolver.setSyncAutomatically(account, AUTHORITY, true);

上記の2行を使用しましたが、正常に動作しています。

于 2012-06-18T20:52:46.910 に答える