Custom Account authenticator. Cleanup after account is removed from device

Is there a way to get some kind of notification/broadcast/etc. when a custom account is removed from “Accounts & sync settings”?

The application I have can facilitate multiple users on a device (this is for a corporate use) and uses a single SQLite database. Say I create multiple users for my application on a device and populate database with data that is relevant only to those two users. My problem here is that if one of the user is removed from “Accounts & sync settings” I have no way to cleanup database and/or some external files on SD card.

  • Difference between image formats RGB888 and ARGB8888
  • Android - howto pass data to the Runnable in runOnUiThread?
  • Is there a way to open file as File object from android's assets folder?
  • Resource.Designer.cs: “Resource … does not contain a definition for …”
  • How to set Single Choice Items inside AlertDialog?
  • RFID Reader for Mobile Devices
  • I could duplicate user information in a redundant table and compare it with registered accounts and then removing user data from the database if user information in the table and Account[] array from AccountManager does not match. Feels dirty to me.

    Related posts:

    How to know when an activity finishes a layout pass?
    Android gradle project builds very slowly
    Strange NoClassDefFoundError error when launching a signed release APK with proguard enabled
    Android: Your content must have a ListView whose id attribute is android.R.id.list
    How to capture the traffic of Genymotion Emulator with WireShark?
    Service not available in geoCoder
  • Camera or Gallery intent destroys old activity on some devices
  • USSD service not working
  • How to run multiple videos with different VideoViews in one activity in android 2.2?
  • LibGDX can't load a specific image
  • Not seeing Nexus7 in Eclipse's Android Devices
  • StrictModeDiskReadViolation when
  • 2 Solutions collect form web for “Custom Account authenticator. Cleanup after account is removed from device”

    You have two options:

    1. You can use the addOnAccountsUpdatedListener method of AccountManager to add a listener in the onCreate method of an Activity or Service — make sure you remove the listener in your onDestroy method (i.e. do NOT use this in an endlessly running service) or the Context used to retrieve the AccountManager will never be garbage collected

    2. The AccountsService will broadcast an intent with the action AccountManager.LOGIN_ACCOUNTS_CHANGED_ACTION every time an account is added, removed or changed which you can add a receiver for.

    I didn’t see a lot of examples on how people implement account cleanup, so I thought I would post my solution (really a variation of the accepted answer).

    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();
        }
    }
    
    Android Babe is a Google Android Fan, All about Android Phones, Android Wear, Android Dev and Android Games Apps and so on.