Аутентификатор пользовательского аккаунта.Очистка после удаления учетной записи с устройства - PullRequest
17 голосов
/ 20 мая 2011

Есть ли способ получить какое-то уведомление / трансляцию / и т.д. когда пользовательская учетная запись удаляется из «Настройки учетных записей и синхронизации»?

Приложение, которое у меня есть, может работать с несколькими пользователями на устройстве (для корпоративного использования) и использует одну базу данных SQLite. Скажем, я создаю несколько пользователей для своего приложения на устройстве и заполняю базу данных данными, которые имеют отношение только к этим двум пользователям. Моя проблема здесь в том, что если один из пользователей удален из «Настройки учетных записей и синхронизации», у меня нет возможности очистить базу данных и / или некоторые внешние файлы на SD-карте.

Я мог бы продублировать информацию о пользователе в избыточной таблице и сравнить ее с зарегистрированными учетными записями, а затем удалить пользовательские данные из базы данных, если информация о пользователях в таблице и массиве Account [] из AccountManager не совпадает. Мне грязно.

Ответы [ 2 ]

12 голосов
/ 20 мая 2011

У вас есть два варианта:

  1. Вы можете использовать <a href="http://developer.android.com/reference/android/accounts/AccountManager.html#addOnAccountsUpdatedListener%28android.accounts.OnAccountsUpdateListener,%20android.os.Handler,%20boolean%29" rel="noreferrer">addOnAccountsUpdatedListener</a> метод AccountManager, чтобы добавить слушателя в методе onCreate Activity или Service - убедитесь, что вы удалили слушателя в вашем onDestroy метод (т.е. НЕ используйте его в бесконечно работающей службе) или Context, используемый для получения AccountManager, никогда не будет собирать мусор

  2. AccountsService будет транслировать намерение с действием <a href="http://developer.android.com/reference/android/accounts/AccountManager.html#LOGIN_ACCOUNTS_CHANGED_ACTION" rel="noreferrer">AccountManager.LOGIN_ACCOUNTS_CHANGED_ACTION</a> каждый раз, когда учетная запись добавляется, удаляется или изменяется, для которой вы можете добавить получателя.

3 голосов
/ 14 апреля 2016

Я не видел много примеров того, как люди осуществляют очистку аккаунта, поэтому я подумал, что опубликую свое решение (на самом деле это вариант принятого ответа).

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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...