android - telefono - Autentificador de cuenta personalizado. Limpieza después de que la cuenta se elimine del dispositivo
perdi google authenticator (2)
No vi muchos ejemplos sobre cómo las personas implementan la limpieza de la cuenta, así que pensé que publicaría mi solución (en realidad, una variación de la respuesta aceptada).
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();
}
}
¿Hay alguna manera de obtener algún tipo de notificación / transmisión / etc. ¿Cuándo se elimina una cuenta personalizada de "Configuración de cuentas y sincronización"?
La aplicación que tengo puede facilitar múltiples usuarios en un dispositivo (esto es para uso corporativo) y utiliza una única base de datos SQLite. Supongamos que creo varios usuarios para mi aplicación en un dispositivo y relleno la base de datos con datos que solo son relevantes para esos dos usuarios. Mi problema aquí es que si uno de los usuarios es eliminado de "Configuración de cuentas y sincronización" no tengo forma de limpiar la base de datos y / o algunos archivos externos en la tarjeta SD.
Podría duplicar la información del usuario en una tabla redundante y compararla con las cuentas registradas y luego eliminar los datos del usuario de la base de datos si la información del usuario en la tabla y la matriz de Cuenta [] de AccountManager no coincide. Me siento sucio.
Tienes dos opciones:
Puede usar el método
addOnAccountsUpdatedListener
deAccountManager
para agregar un servicio de escucha en el métodoonCreate
de unaActivity
oService
; asegúrese de eliminar el servicio de escucha en su métodoonDestroy
(es decir, NO use esto en un servicio que se ejecute de forma continua) o elContext
utilizado para recuperar elAccountManager
nunca será recogido basuraEl Servicio de
AccountsService
emitirá un intento con la acciónAccountManager.LOGIN_ACCOUNTS_CHANGED_ACTION
cada vez que se agregue, elimine o cambie una cuenta a la que puede agregar un receptor.