Как приложение Android реагирует на критические изменения в среде?

Скажем, есть приложение, которое создает учетную запись в AccountManager. Пользователь некоторое время изучает довольно сложный график активности этого приложения, затем переходит в Accounts and Sync в настройках Android, удаляет учетную запись и подписывает ее (все еще находится в Accounts and Sync как другой пользователь.

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

Итак, возникает вопрос: что делать с этими сиротами?

  • Я мог бы использовать что-то вроде clearTaskOnLaunch, но все действия находятся в фоновом режиме, когда происходит изменение.
  • Установить флаг в SharedPreferences и проверить onResume() каждого действия, а затем запустить clearTask активность, если это необходимо? Слишком грязный.
  • Лучший вариант, который я смог придумать, - использовать android.os.Process.killProcess(android.os.Process.myPid()), чтобы убить все действия. Это не слишком грациозно, но выполняет работу. Единственный побочный эффект заключается в том, что стек активности все еще существует, когда наиболее разумным кажется, что нужно начинать с действия LAUNCHER с четкой историей.

Итак, что было бы лучшим способом ответить на описанный сценарий?

Ответ 1

Все ваши действия распространяются от класса MyActivity, который имеет член BroadcastReceiver: mChangeReceiver.

Имейте MyActivity зарегистрируйте mChangeReceiver в onCreate (и отмените регистрацию в onDestroy) до намерения LOGIN_ACCOUNTS_CHANGED.

Попросите mChangeReceiver вызвать абстрактный метод onAccountChanged(), который все расширяющие классы должны переопределить и реализовать, чтобы отразить изменение в графическом интерфейсе.

Что это. Теперь, всякий раз, когда изменяется учетная запись, все ваши жизненные действия получат свой метод onAccountChanged и обновят их графический интерфейс.

Ответ 2

У меня есть некоторые идеи, основанные на том факте, что у вас есть механизм входа в систему:

о пользовательском интерфейсе, как насчет обновления пользовательского интерфейса пользователя (возможно, textview) на onPause на "" и обновления его текущему пользователю onResume?

о закрытии действий, если необходимо, вы можете сохранить текущего пользователя в глобальную переменную и за активность. каждое действие должно проверять, совпадает ли глобальный с тем, который был сохранен в последний раз, когда они были обновлены. если они отличаются, вы можете закрыть активность. вы также можете использовать флаг clearTask, как вы уже писали.

другим способом обработки действий является использование стека фрагментов. для получения дополнительной информации проверьте примеры поддержки андроида в стеке фрагментов.