Подтвердить что ты не робот

Пользовательский аутентификатор учетной записи. Очистка после удаления учетной записи с устройства

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

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

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

4b9b3361

Ответ 1

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

  • Вы можете использовать метод addOnAccountsUpdatedListener AccountManager, чтобы добавить слушателя в метод onCreate для Activity или Service - убедитесь, что вы удаляете прослушиватель в onDestroy (т.е. НЕ используйте это в бесконечно запущенном сервисе), или Context, используемый для извлечения AccountManager, никогда не будет собираться с мусором

  • AccountsService будет транслировать намерение с действием AccountManager.LOGIN_ACCOUNTS_CHANGED_ACTION каждый раз, когда учетная запись будет добавлена, удалена или изменена, к которой вы можете добавить приемник.

Ответ 2

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

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();
    }
}