これは、この問題に関連して私が見た唯一の質問であるため、1年以上遅れた回答があります。また、Android システムがカスタム アカウントを自動的に同期するため、永続的なウェイクロックの問題に遭遇しました。
これを処理する最良の方法は、最小限のコードを必要とし、実際には、コードで同期するように特別に呼び出されない限り、アカウントが同期しないようにすることです。
ContentResolver.setIsSyncable(account, ContactsContract.AUTHORITY, 0);
これには、アカウントを作成した瞬間に、この静的メソッドを呼び出す必要があります。最初のパラメーターはこの設定を設定するアカウント、2 番目のパラメーターは使用されるコンテンツ プロバイダーの権限、3 番目のパラメーターは整数で、正の数に設定すると同期が有効になり、0 に設定すると同期が無効になり、それ以外に設定すると整数になります。不明にします。使用する権限は、「sync_something.xml」内の contentAuthority 属性の下にあり、 SyncAdapter によって使用されます。
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
android:contentAuthority="com.android.contacts"
android:accountType="com.myapp.account"/> <!-- This being your own account type-->
上記の xml ファイルは、AndroidManifest.xml のサービス部分内で指定されています。
<service android:name=".DummySyncAdapterService"
exported="true"
android:process=":contacts">
<intent-filter>
<action android:name="android.content.SyncAdapter" />
</intent-filter>
<meta-data android:name="android.content.SyncAdapter"
android:resource="@xml/sync_something" /> <!--This points to your SyncAdapter XML-->
</service>
これは、LoginActivity 内でカスタム アカウントを作成するために使用するコード スニペットです。
Account account = new Account("John Doe", "com.myapp.account");
ContentResolver.setIsSyncable(account, ContactsContract.AUTHORITY, 0);
AccountManager am = AccountManager.get(LoginActivity.this);
boolean accountCreated = am.addAccountExplicitly(account, "Password", null);
Bundle extras = LoginActivity.this.getIntent().getExtras();
if(extras != null){
if (accountCreated) {
AccountAuthenticatorResponse response = extras.getParcelable(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE);
Bundle result = new Bundle();
result.putString(AccountManager.KEY_ACCOUNT_NAME, "John Doe");
result.putString(AccountManager.KEY_ACCOUNT_TYPE, "com.myapp.account");
response.onResult(result);
}
}
これの重要な部分は、システムがサービスを同期しようとするときに、サービスが同期可能かどうかを最初に確認し、false に設定されている場合は同期をキャンセルすることです。これで、独自に作成する必要ContentProvider
もContentProvider
、データと同期の下に表示される必要もなくなりました。ただし、onBind メソッド内で IBinder を返す AbstractThreadedSyncAdapter のスタブ実装が必要です。最後になりましたが、アプリ内に機能を追加しない限り、ユーザーは同期を有効にしたり、このアカウントの [今すぐ同期] ボタンを使用したりできません。