是否SyncAdapter得到通知时的AccountManager删除帐户?(Does SyncAd

2019-06-25 18:46发布

所以,我重申的问题是,当你去设置- >帐户与同步,然后选择已创建的帐户,你的SyncAdapter与云服务器同步,并选择要删除帐户,有什么至于你的情况SyncAdapter是什么呢? 有显示要求您确认,并与该帐户相关的手机上的数据将被删除的对话框。 我不能轻易相信,这个框架可以自动删除我的数据SyncAdapter已存储在本地数据库中,但它似乎暗示移除帐户(我会同意,是应该)删除数据。 有没有除了我SyncAdapter ,这将有助于排序的回调帐户去除处理从本地数据库中删除所有适当的数据? 也许它必须通过做AccountManager代替; 我AccountManager当帐号被删除得到通知,并从那里我可以触发数据删除没有SyncAdapter

编辑:在一个相关的说明,为同步经理打电话给我SyncAdapter每个帐户在添加一个新的帐户进行同步? 我看到一个onPerformSync(...)被用于当我添加的帐户刚刚添加的帐户沿着先前添加的帐户执行的,并希望停止。

Answer 1:

我发现的解决方案是让应用程序的ContentProvider实施OnAccountsUpdateListener 。 附加ContentProvider作为侦听器在其onCreate与方法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的当前连接的帐户,然后建立与SQL查询String 。 我在后台线程上执行查询的数据库删除,以除去与当前未连接帐户相关的数据。 我通知内容改变,但并不需要与服务器同步。



Answer 2:

没有,但你的身份验证器[1]。 该帐户被删除之前,这种方法被称为:

AbstractAccountAuthenticator.getAccountRemovalAllowed(AccountAuthenticatorResponse, Account) 

帐户参数是该帐户被删除-默认行为是允许移除帐户:

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

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

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



Answer 3:

另一种选择是注册了android.accounts.LOGIN_ACCOUNTS_CHANGED播出的AccountManager发出。 不幸的是,这种广播发送出去,只要任何帐户被更改和广播没有提供进一步的信息,什么或者改变。

所以,你必须查询客户经理,看看它有多少的“你”占离开并删除那些丢失的数据。



文章来源: Does SyncAdapter get notified when AccountManager removes account?