Я столкнулся со следующим сценарием. Мое приложение использует AccountManager для хранения учетных данных пользователей. Можно войти в более чем одну учетную запись одновременно, подобно тому, как это делает твиттер (вы можете перейти в свой профиль и переключиться на другую зарегистрированную учетную запись). Одна из зарегистрированных учетных записей считается активной одновременно.
Пока не знаю, способ, которым я использовал, чтобы определить, какая учетная запись в настоящее время используется пользователем, состоит в том, чтобы сохранить имя текущей учетной записи в SharedPreferences. Таким образом, вы можете просто получить это имя из префов в любое время, получить список зарегистрированных учетных записей в диспетчере учетных записей и выполнять итерацию, пока не получите правильный объект учетной записи. Что-то вроде этого:
String currentAccountName = SharedPreferences.get(mContext).getString(PREF_CURRENT_ACCOUNT, null);
Account[] accounts = AccountManager.get(mContext).getAccountsByType(MY_ACCOUNT_TYPE);
Account loggedAccount;
for (Account account : accounts) {
if (account.name.equals(currentAccountName)) {
loggedAccount = account;
break;
}
}
//Get the token for this account
String authToken = AccountManager.get(mContext).getToken(account, MY_ACCOUNT_TYPE,...).getResult().get(AccountManager.AUTH_TOKEN);
Кроме того, при запуске SyncAdapter он получает currentAccountName из настроек, чтобы получить токен и подключиться к серверу.
Проблема в том, что с API 21 больше небезопасно получать доступ к настройкам из разных процессов. Это означает, что если я сохраню в prefs currentLoggedAccount, а затем запущу адаптер синхронизации, он может не получить сохраненный pref, потому что он выполняется в другом процессе.
Как бы вы справились с этим сценарием?