19

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

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

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

4

2 回答 2

13

你有两个选择:

  1. 您可以使用方法在 an的addOnAccountsUpdatedListener方法中AccountManager添加侦听器或-- 确保在您的方法中删除侦听器(即不要在无休止运行的服务中使用它)或用于检索的永远不会被垃圾收集onCreateActivityServiceonDestroyContextAccountManager

  2. 每次添加、删除或更改帐户时,都会广播带有操作的意图,您可以为其添加接收器AccountsServiceAccountManager.LOGIN_ACCOUNTS_CHANGED_ACTION

于 2011-05-20T18:16:49.423 回答
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();
    }
}
于 2016-04-14T13:57:45.870 回答