6

因此,我重申的问题是,当您转到“设置”->“帐户和同步”并选择创建的SyncAdapter与云服务器同步的帐户,然后选择“删除帐户”时,就您SyncAdapter而言会发生什么?将显示一个对话框,要求您确认,并且与该帐户关联的手机上的数据将被删除。我不能轻易相信该框架可以自动删除我SyncAdapter存储在本地数据库中的数据,但这似乎意味着删除帐户将(我同意应该)删除该数据。是否有我的补充可以SyncAdapter作为帐户删除的回调来处理从本地数据库中删除所有适当的数据?也许它必须通过AccountManager反而; 当帐户被删除时我AccountManager会收到通知,并且我可以从那里触发数据删除而无需SyncAdapter.

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

4

3 回答 3

7

我发现解决方案是让应用程序ContentProvider实现OnAccountsUpdateListener。在其方法中附加ContentProvider作为侦听器,然后实现接口方法,如onCreateaccount_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当前连接的帐户,然后用它构建一个 SQL 查询String。我在该查询的后台线程中对数据库执行删除操作,以删除与当前未连接的帐户关联的数据。我通知内容发生了变化,但不需要与服务器同步。

于 2012-08-15T16:42:25.727 回答
5

不,但是您的身份验证器可以[1]。在删除帐户之前调用此方法:

AbstractAccountAuthenticator.getAccountRemovalAllowed(AccountAuthenticatorResponse, Account) 

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

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

..但我想这是一个钩子,您可以使用它来整理或阻止您希望删除的帐户。

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

于 2013-05-20T14:18:35.117 回答
4

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

因此,您必须查询客户经理并查看它还剩下多少“您的”帐户并删除丢失的数据。

于 2014-08-07T08:10:17.153 回答