Пользовательский аутентификатор учетной записи. Очистка после удаления учетной записи с устройства
Есть ли способ получить какое-то уведомление/трансляцию/и т.д. когда пользовательская учетная запись удаляется из "Учетные записи и настройки синхронизации"?
Приложение, которое у меня есть, может помочь нескольким пользователям на устройстве (это для корпоративного использования) и использует единую базу данных SQLite. Предположим, что я создаю несколько пользователей для своего приложения на устройстве и заполняю базу данных данными, имеющими отношение только к этим двум пользователям. Моя проблема заключается в том, что если один из пользователей удален из "Учетных записей и настроек синхронизации", у меня нет возможности очистить базу данных и/или некоторые внешние файлы на SD-карте.
Я мог бы дублировать информацию пользователя в избыточной таблице и сравнивать ее с зарегистрированными учетными записями, а затем удалять пользовательские данные из базы данных, если пользовательская информация в таблице и массив Account [] из AccountManager не совпадают. Чувствую себя грязным для меня.
Ответы
Ответ 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();
}
}