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

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

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

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

Solutions Collecting From Web of "Пользовательский аутентификатор учетной записи. Очистка после удаления учетной записи с устройства"

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

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

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

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

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