自定义帐户验证器。从设备中删除帐户后清理

时间:2011-05-20 15:35:26

标签: android accountmanager

有没有办法获得某种通知/广播/等。从“帐户和同步设置”中删除自定义帐户时?

我拥有的应用程序可以为设备上的多个用户提供便利(这是供企业使用)并使用单个SQLite数据库。假设我在设备上为我的应用程序创建多个用户,并使用仅与这两个用户相关的数据填充数据库。我的问题是,如果其中一个用户从“帐户和同步设置”中删除,我无法清理SD卡上的数据库和/或某些外部文件。

我可以在冗余表中复制用户信息,并将其与注册帐户进行比较,然后如果表中的用户信息与AccountManager中的Account []数组不匹配,则从数据库中删除用户数据。感觉脏了。

2 个答案:

答案 0 :(得分:12)

您有两种选择:

  1. 您可以使用addOnAccountsUpdatedListener的{​​{1}}方法在AccountManageronCreate的{​​{1}}方法中添加听众确定你在Activity方法中删除了监听器(即不要在无休止运行的服务中使用它),或者用于检索Service的{​​{1}}永远不会被垃圾收集

  2. 每次添加,删除或更改帐户时,onDestroy都会使用操作Context广播一个意图,您可以为其添加接收方。

答案 1 :(得分:3)

我没有看到很多关于人们如何实施帐户清理的例子,所以我想我会发布我的解决方案(实际上是接受答案的变体)。

public class AccountAuthenticatorService extends Service {
    private AccountManager _accountManager;
    private Account[] _currentAccounts;
    private OnAccountsUpdateListener _accountsUpdateListener = new OnAccountsUpdateListener() {
        @Override
        public void onAccountsUpdated(Account[] accounts) {

            // NOTE: this is every account on the device (you may want to filter by type)
            if(_currentAccounts == null){
                _currentAccounts = accounts;
                return;
            }

            for(Account currentAccount : _currentAccounts) {
                boolean accountExists = false;
                for (Account account : accounts) {
                    if(account.equals(currentAccount)){
                        accountExists = true;
                        break;
                    }
                }

                if(!accountExists){
                    // Take actions to clean up.  Maybe send intent on Local Broadcast reciever
                }
            }
        }
    };

    public AccountAuthenticatorService() {

    }

    @Override
    public void onCreate() {
        super.onCreate();
        _accountManager = AccountManager.get(this);

        // set to true so we get the current list of accounts right away.
        _accountManager.addOnAccountsUpdatedListener(_accountsUpdateListener, new Handler(), true);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
       _accountManager.removeOnAccountsUpdatedListener(_accountsUpdateListener);
    }

    @Override
    public IBinder onBind(Intent intent) {
        AccountAuthenticator authenticator = new AccountAuthenticator(this);
        return authenticator.getIBinder();
    }
}