SyncAdapter で少し奇妙な動作に遭遇しました。
初めてアプリをインストールすると (adb でアンインストールした後)、アプリが起動してアカウントが作成されます。一部のステートメント (以下を参照) の順序によっては、私の SyncAdapter の onPerformSync() が呼び出されることはありません。「アカウントと同期」の下の私のアカウントには、「同期中」アイコンが無期限に回転しています。次に、アプリのアカウントの横にある同期チェックボックスをオフにしてから再度オンにすると、 onPerformSync() がすぐに呼び出されます。
これにより、SyncAdapter が呼び出されなくなります。「同期中」アイコンは、チェックを外さない限り永遠に回転し、同期チェックボックスを再度オンにします。
final Account account = new Account(mUsername, getString(R.string.ACCOUNT_TYPE));
mAccountManager.addAccountExplicitly(account, mPassword, null);
ContentResolver.setSyncAutomatically(account, getString(R.string.CONTENT_AUTHORITY), true);
ContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1);
同じステートメントをこのように並べると、すべてが完全に機能します。
final Account account = new Account(mUsername, getString(R.string.ACCOUNT_TYPE));
ContentResolver.setSyncAutomatically(account, getString(R.string.CONTENT_AUTHORITY), true);
ContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1);
mAccountManager.addAccountExplicitly(account, mPassword, null);
私の推測では、アカウントの作成時に即座に同期要求を開始するため、SyncManager が一貫性のない状態になり、その足元で構成を変更していると思われます。しかし、(かろうじて一貫性のある) ドキュメントでは、いつでもこれらの関数を呼び出す際の問題については言及されていません。
SyncAdapters に苦労している他の人への余談ですが、 を呼び出さない限り、それcontentResolver.requestSync()
がトリガーされないことがわかりました。SyncAdapter.onPerformSync()
ContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1);
誰かがこの動作を説明できますか? アカウントと同期に関するドキュメントは、控えめに言っても不明確です。
2.1 SDK に対してコンパイルすると、2.1 エミュレーターでこの動作が発生します。