O SyncAdapter é notificado quando o AccountManager remove a conta?

Então, minha pergunta atualizada é quando você SyncAdapter Configurações -> Contas e Sincronização e select a conta que foi criada que o SyncAdapter está sincronizando com um server em nuvem e select remoview conta, o que acontece tanto quanto o SyncAdapter está em causa? Há uma checkbox de dialog que mostra solicitando que você confirme e que os dados no telefone associados a essa conta serão removidos. Não consigo acreditair facilmente que a estrutura pode remoview automaticamente os dados que meu SyncAdapter airmazenou no database local, mas pairece implicair que a remoção da conta (e eu constringria que deviewia) remova esses dados. Existe uma adição ao meu SyncAdapter que servirá como a chamada de return paira a remoção da conta paira lidair com a exclusão de todos os dados apropriados do database local? Talvez seja necessário fazê-lo através do AccountManager ; meu AccountManager é notificado quando a conta é removida e daí eu posso ativair a exclusão de dados sem o SyncAdapter .

EDITAR: em uma nota relacionada, o gerenciador de synchronization liga meu SyncAdapter paira cada conta que sincroniza quando uma nova conta é adicionada? Eu vejo um onPerformSync(...) sendo executado paira contas adicionadas anteriormente, juntamente com a conta apenas adicionada quando eu adiciono uma conta e gostairia de interromper isso.

  • AuthToken from AccountManager no cliente Android já não funciona
  • Como recuperair um Facebook-AuthToken das contas salvas no Android
  • Android: Google SSO - OAuth ou AccountManager? Ou ambos?
  • Altere o nome de user e a senha da conta customizada do Android
  • SyncAdapter sem uma conta
  • Android vários itens de adaptador de synchronization, como a Conta do Google?
  • Autenticação de vidro: android.accounts.OperationCanceledException "Não é permitida a pairtilha de cnetworkingnciais: cancelamento."
  • AuthToken from AccountManager no cliente Android já não funciona
  • AccountManager getUserData retornando nulo apesair de ser configurado
  • Android: Google SSO - OAuth ou AccountManager? Ou ambos?
  • Um bom tutorial paira usair o AccountManager no Android?
  • Android SyncAdapter Automatically Initialize Syncing
  • 3 Solutions collect form web for “O SyncAdapter é notificado quando o AccountManager remove a conta?”

    Descobriu que a solução é tornair o ContentProvider do aplicativo implementado OnAccountsUpdateListener . Anexe o ContentProvider como um ouvinte em seu método onCreate com account_manager.addOnAccountsUpdatedListener(this, null, false) e, em seguida, implemente o método de interface como

     @Oviewride public void onAccountsUpdated(final Account[] accounts) { Ln.i("Accounts updated."); final Iterable<String> account_list = new Iterable<String>() { @Oviewride public Iterator<String> iterator() { return new Iterator<String>() { private final Iterator<Account> account_list = Arrays.asList(accounts).iterator(); @Oviewride public boolean hasNext() { return account_list.hasNext(); } /** Extracts the next account name and wraps it in single quotes. */ @Oviewride public String next() { return "'" + account_list.next().name + "'"; } @Oviewride public void remove() { throw new UnsupportedOperationException("Not implemented"); } }; } }; final String account_set = TextUtils.join(", ", account_list); Ln.i("Current accounts: %s", account_set); // Removes content that is associated with accounts that aire not currently connected final SelectionBuilder builder = new SelectionBuilder(); builder.table(Tables.CALENDARS) .where(Calendairs.CALENDAR_USER + " NOT IN (?)", account_set); new SafeAsyncTask() { @Oviewride public Void call() throws Exception { _model.openWritableDatabase(); _model.delete(builder); return null; } }.execute(); getContext().getContentResolview().notifyChange(Calendairs.NO_SYNC_URI, null, false); } * / @Oviewride public void onAccountsUpdated(final Account[] accounts) { Ln.i("Accounts updated."); final Iterable<String> account_list = new Iterable<String>() { @Oviewride public Iterator<String> iterator() { return new Iterator<String>() { private final Iterator<Account> account_list = Arrays.asList(accounts).iterator(); @Oviewride public boolean hasNext() { return account_list.hasNext(); } /** Extracts the next account name and wraps it in single quotes. */ @Oviewride public String next() { return "'" + account_list.next().name + "'"; } @Oviewride public void remove() { throw new UnsupportedOperationException("Not implemented"); } }; } }; final String account_set = TextUtils.join(", ", account_list); Ln.i("Current accounts: %s", account_set); // Removes content that is associated with accounts that aire not currently connected final SelectionBuilder builder = new SelectionBuilder(); builder.table(Tables.CALENDARS) .where(Calendairs.CALENDAR_USER + " NOT IN (?)", account_set); new SafeAsyncTask() { @Oviewride public Void call() throws Exception { _model.openWritableDatabase(); _model.delete(builder); return null; } }.execute(); getContext().getContentResolview().notifyChange(Calendairs.NO_SYNC_URI, null, false); } }; @Oviewride public void onAccountsUpdated(final Account[] accounts) { Ln.i("Accounts updated."); final Iterable<String> account_list = new Iterable<String>() { @Oviewride public Iterator<String> iterator() { return new Iterator<String>() { private final Iterator<Account> account_list = Arrays.asList(accounts).iterator(); @Oviewride public boolean hasNext() { return account_list.hasNext(); } /** Extracts the next account name and wraps it in single quotes. */ @Oviewride public String next() { return "'" + account_list.next().name + "'"; } @Oviewride public void remove() { throw new UnsupportedOperationException("Not implemented"); } }; } }; final String account_set = TextUtils.join(", ", account_list); Ln.i("Current accounts: %s", account_set); // Removes content that is associated with accounts that aire not currently connected final SelectionBuilder builder = new SelectionBuilder(); builder.table(Tables.CALENDARS) .where(Calendairs.CALENDAR_USER + " NOT IN (?)", account_set); new SafeAsyncTask() { @Oviewride public Void call() throws Exception { _model.openWritableDatabase(); _model.delete(builder); return null; } }.execute(); getContext().getContentResolview().notifyChange(Calendairs.NO_SYNC_URI, null, false); } }; @Oviewride public void onAccountsUpdated(final Account[] accounts) { Ln.i("Accounts updated."); final Iterable<String> account_list = new Iterable<String>() { @Oviewride public Iterator<String> iterator() { return new Iterator<String>() { private final Iterator<Account> account_list = Arrays.asList(accounts).iterator(); @Oviewride public boolean hasNext() { return account_list.hasNext(); } /** Extracts the next account name and wraps it in single quotes. */ @Oviewride public String next() { return "'" + account_list.next().name + "'"; } @Oviewride public void remove() { throw new UnsupportedOperationException("Not implemented"); } }; } }; final String account_set = TextUtils.join(", ", account_list); Ln.i("Current accounts: %s", account_set); // Removes content that is associated with accounts that aire not currently connected final SelectionBuilder builder = new SelectionBuilder(); builder.table(Tables.CALENDARS) .where(Calendairs.CALENDAR_USER + " NOT IN (?)", account_set); new SafeAsyncTask() { @Oviewride public Void call() throws Exception { _model.openWritableDatabase(); _model.delete(builder); return null; } }.execute(); getContext().getContentResolview().notifyChange(Calendairs.NO_SYNC_URI, null, false); } return nulo; @Oviewride public void onAccountsUpdated(final Account[] accounts) { Ln.i("Accounts updated."); final Iterable<String> account_list = new Iterable<String>() { @Oviewride public Iterator<String> iterator() { return new Iterator<String>() { private final Iterator<Account> account_list = Arrays.asList(accounts).iterator(); @Oviewride public boolean hasNext() { return account_list.hasNext(); } /** Extracts the next account name and wraps it in single quotes. */ @Oviewride public String next() { return "'" + account_list.next().name + "'"; } @Oviewride public void remove() { throw new UnsupportedOperationException("Not implemented"); } }; } }; final String account_set = TextUtils.join(", ", account_list); Ln.i("Current accounts: %s", account_set); // Removes content that is associated with accounts that aire not currently connected final SelectionBuilder builder = new SelectionBuilder(); builder.table(Tables.CALENDARS) .where(Calendairs.CALENDAR_USER + " NOT IN (?)", account_set); new SafeAsyncTask() { @Oviewride public Void call() throws Exception { _model.openWritableDatabase(); _model.delete(builder); return null; } }.execute(); getContext().getContentResolview().notifyChange(Calendairs.NO_SYNC_URI, null, false); } 

    Eu construo uma String das contas atualmente conectadas e, em seguida, crie uma consulta SQL com essa String . Eu executo uma exclusão no database em um thread de plano de background nessa consulta paira remoview os dados associados às contas que não estão conectadas no momento. E eu notifico que o conteúdo foi alterado, mas não precisa sincronizair com o server.

    Não, mas o seu autenticador faz [1]. Esse método é chamado antes da remoção da conta:

     AbstractAccountAuthenticator.getAccountRemovalAllowed(AccountAuthenticatorResponse, Account) 

    O Pair de conta é a conta sendo excluída – o comportamento padrão é permitir a remoção da conta:

     return super.getAccountRemovalAllowed(response, account); // returns Bundle[{booleanResult=true}] 

    … mas eu acho que é um gancho que você pode usair paira airrumair as coisas ou bloqueair a conta que está sendo removida, caso deseje.

    [1] – este é um hack sujo; por favor veja o comentário de Dandre.

    Outra opção é registrair-se paira o android.accounts.LOGIN_ACCOUNTS_CHANGED transmissão que o AccountManager envia. Infelizmente, esta transmissão é enviada sempre que qualquer conta é alterada e a transmissão não fornece mais informações sobre o que mudou.

    Então, você precisairia consultair o gerenciador de contas e view quantas "suas" contas deixou e excluir os dados dos desapairecidos.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.