Я работаю над довольно сложным Android-приложением, для которого требуется довольно большой объем данных о приложении (я бы сказал, всего около 500 КБ - это много для мобильного устройства?). Насколько я могу судить, любое изменение ориентации в приложении (а точнее в деятельности) приводит к полному разрушению и воссозданию активности. Основываясь на моих выводах, класс Application не имеет того же жизненного цикла (т.е. он для всех намерений и целей всегда создается). Имеет ли смысл хранить информацию о состоянии внутри класса приложения, а затем ссылаться на нее из Activity, или это вообще не «приемлемый» метод из-за ограничений памяти на мобильных устройствах? Я очень ценю любые советы по этой теме. Спасибо!
112
Ответы:
Не думаю, что 500 КБ - это такая уж большая проблема.
То, что вы описали, - это именно то, как я решил проблему потери данных в процессе работы. Я создал глобальный синглтон в классе Application и смог получить к нему доступ из использованных мной действий.
Вы можете передавать данные в глобальном синглтоне, если он будет использоваться много раз.
Затем вызывайте его в любом действии:
Я обсуждаю это здесь, в своем блоге , в разделе «Global Singleton».
источник
Ошибаются те, кто рассчитывает на
Application
пример. Сначала может показаться, чтоApplication
существует, пока существует весь процесс приложения, но это неверное предположение.При необходимости ОС может убивать процессы. Все процессы разделены на 5 уровней «убиваемости», указанных в документе .
Так, например, если ваше приложение переходит в фоновый режим из-за того, что пользователь отвечает на входящий вызов, тогда в зависимости от состояния ОЗУ ОС может (или не может) убить ваш процесс (уничтожить
Application
экземпляр в процессе) .Я думаю, что лучшим подходом было бы сохранить ваши данные во внутреннем хранилище, а затем прочитать его, когда ваша деятельность возобновится.
ОБНОВИТЬ:
Получил много отрицательных отзывов, пора добавить уточнение. :) Ну, изначально я действительно использовал неправильное предположение, что состояние действительно важно для приложения. Однако, если ваше приложение в порядке, что иногда состояние теряется (это могут быть некоторые изображения, которые будут просто перечитаны / повторно загружены), тогда вполне нормально оставить его в качестве члена
Application
.источник
Application
экземпляр, однако статических данных, на которые вы рассчитываете, не будет, если вы не сохраните их.Если вы хотите получить доступ к «Глобальному синглтону» вне действия и не хотите проходить
Context
через все задействованные объекты для получения синглтона, вы можете просто определить статический атрибут в своем классе приложения, который содержит ссылку на сам. Просто инициализируйте атрибут вonCreate()
методе.Например:
Поскольку подклассы
Application
также могут получать ресурсы, вы можете получить к ним доступ просто, когда определите статический метод, который их возвращает, например:Но будьте очень осторожны при передаче контекстных ссылок, чтобы избежать утечки памяти .
источник
Application
чтобы сделать это. Для этого вы можете объявить статическую переменную-член в любом классе .Дэйв, что это за данные? Если это общие данные, относящиеся к приложению в целом (пример: пользовательские данные), расширьте класс Application и сохраните его там. Если данные относятся к Activity, следует использовать обработчики onSaveInstanceState и onRestoreInstanceState для сохранения данных при повороте экрана.
источник
Фактически вы можете переопределить функцию ориентации, чтобы убедиться, что ваша деятельность не уничтожена и не воссоздана. Смотри сюда .
источник
Вы можете создать класс Application и сохранить все свои данные на нем для использования в любом месте вашего приложения.
источник
Я знаю, что это очень старый вопрос, но использование ViewModel из компонентов Jetpack - лучший способ сохранить данные между ротацией Activity.
источник