当AccountManager删除帐户时,是否会通知同步适配器?

时间:2012-06-26 19:39:33

标签: android accountmanager android-syncadapter

所以,我的问题重申是当你去设置 - >账户&同步并选择您的SyncAdapter正在与云服务器同步的帐户,并选择删除帐户,就SyncAdapter而言会发生什么?将显示一个对话框,要求您确认,并且将删除与该帐户关联的电话上的数据。我不能轻易相信框架可以自动删除我SyncAdapter存储在本地数据库中的数据,但似乎暗示删除帐户将(我同意应该)删除该数据。我的SyncAdapter是否会添加一些作为删除帐户的回调来处理从本地数据库中删除所有适当的数据?也许必须通过AccountManager代替;我的AccountManager会在帐户被删除后收到通知,我可以在没有SyncAdapter的情况下触发数据删除。

编辑: 在相关说明中,同步管理员是否为添加新帐户时同步的每个帐户调用SyncAdapter?我在添加帐户时看到onPerformSync(...)为之前添加的帐户以及刚刚添加的帐户执行,并希望停止此操作。

3 个答案:

答案 0 :(得分:7)

我发现解决方案是让应用ContentProvider实施OnAccountsUpdateListener。使用ContentProvideronCreate作为侦听器附加到account_manager.addOnAccountsUpdatedListener(this, null, false)方法中,然后实现接口方法,如

@Override
public void onAccountsUpdated(final Account[] accounts) {
    Ln.i("Accounts updated.");
    final Iterable<String> account_list = new Iterable<String>() {
        @Override
        public Iterator<String> iterator() {
            return new Iterator<String>() {
                private final Iterator<Account> account_list = Arrays.asList(accounts).iterator();

                @Override
                public boolean hasNext() {
                    return account_list.hasNext();
                }

                /** Extracts the next account name and wraps it in single quotes. */
                @Override
                public String next() {
                    return "'" + account_list.next().name + "'";
                }

                @Override
                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 are not currently connected
    final SelectionBuilder builder = new SelectionBuilder();
    builder.table(Tables.CALENDARS)
           .where(Calendars.CALENDAR_USER + " NOT IN (?)", account_set);

    new SafeAsyncTask() {
        @Override
        public Void call() throws Exception {
            _model.openWritableDatabase();
            _model.delete(builder);
            return null;
        }
    }.execute();


    getContext().getContentResolver().notifyChange(Calendars.NO_SYNC_URI, null, false);
}

我构建了当前连接帐户的String,然后使用String构建SQL查询。我在该查询的后台线程中对数据库执行删除操作,以删除与当前未连接的帐户关联的数据。我通知内容已更改,但不需要与服务器同步。

答案 1 :(得分:5)

不,但您的身份验证员确实[1]。在删除帐户之前调用此方法:

AbstractAccountAuthenticator.getAccountRemovalAllowed(AccountAuthenticatorResponse, Account) 

帐户 参数是要删除的帐户 - 默认行为是允许删除帐户:

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

..但我想这是一个钩子,你可以用来整理东西或阻止你想要移除的帐户。

[1] - 这是一个肮脏的黑客;请看Dandre的评论。

答案 2 :(得分:3)

另一种选择是注册android.accounts.LOGIN_ACCOUNTS_CHANGED发出的AccountManager广播。不幸的是,每当任何帐户被更改时,此广播就会被发送出去,并且广播不会提供更改的信息。

因此,您必须查询客户经理并查看有多少&#34;您的&#34;它已离开的帐户并删除遗失的数据。