Сохраняющееся состояние в классе приложений Android
Я разрабатываю приложение для Android, состоящее из более чем 10 видов деятельности. У меня есть некоторые объекты состояния, к которым я обращаюсь почти в каждой деятельности, и для этой цели они были реализованы как глобальные статические переменные в классе MyApplication.
Я заметил, что этот подход в порядке, пока пользователь находится "в" приложении. Однако, когда он нажимает кнопку "Домой" и открывает другие приложения, а затем возвращается к моему приложению с помощью кнопки "Недавние действия", я вижу, что система Android сбрасывает статические значения из MyApplication, поэтому мне приходится иметь дело с NullPointerExceptions. Я знаю, что это вызвано тем, что Android убивает и воссоздает процесс приложения.
Я знаю, что лучший способ сохранить эти данные - это использовать SharedPreferences или SQLite, и у меня нет проблем с проверкой, если MyState==null в onCreate для, и восстановлением этого, но проблема в том, что я не знаю, когда правильно сохранить мой объект состояния (в префе или базе данных). Я попытался переопределить метод finalize() MyApplication - ничего хорошего, я видел, что onLowMemory не может быть вызван, я не вижу, как я могу использовать onPause, OnStop и т. Д., Потому что у меня так много действий, что десериализация сериализации значительно замедлить приложение.
Какие-нибудь мысли? Заранее спасибо!
1 ответ
Лучше не зависеть от Application
Класс, если вам не нужно загружать некоторые данные, прежде чем что-либо еще запускается. Android может убить ваш процесс в любое время, чтобы освободить ресурсы, поэтому ваше приложение должно справиться с этим. Сохраните все свои данные в классе snigleton и загрузите их лениво - проверьте на нулевое значение и, если да, загрузите при первом доступе. Если состояние должно быть постоянным, рассмотрите возможность сохранения в нем файлов / общих настроек. Если нет, ваше приложение, вероятно, может жить без него, поэтому просто убедитесь, что вы проверите null
, так далее.
Как правило, вы должны сохранять состояние, когда действия становятся неактивными - onStop()
, onPause()
, но вы можете сохранить, как только это имеет смысл (например, пользователь ввел все необходимые данные). Раскрутить AsyncTask
сохранить данные в фоновом режиме и позволить пользователю продолжить свою работу.