Я работаю над довольно сложным Android-приложением, для которого требуется несколько большое количество данных о приложении (я бы сказал, всего около 500 КБ - это большой размер для мобильного устройства?). Из того, что я могу сказать, любое изменение ориентации приложения (в деятельности, если быть более точным) вызывает полное разрушение и восстановление активности. Основываясь на моих выводах, класс Application не имеет одинакового жизненного цикла (т.е. Он, по сути, всегда инстанцируется). Имеет ли смысл хранить информацию о состоянии внутри класса приложения, а затем ссылаться на нее из Activity или это вообще не "приемлемый" метод из-за ограничений памяти на мобильных устройствах? Я очень ценю любые советы по этой теме. Спасибо!
Использование класса приложения Android для сохранения данных
Ответ 1
Я не думаю, что 500kb будет такой большой сделкой.
То, что вы описали, - это именно то, как я решал свою проблему потери данных в деятельности. Я создал глобальный синглтон в классе Application и смог получить к нему доступ из действий, которые я использовал.
Вы можете передавать данные в Global Singleton, если они будут использоваться много.
public class YourApplication extends Application
{
public SomeDataClass data = new SomeDataClass();
}
Затем вызовите его в любом виде:
YourApplication appState = ((YourApplication)this.getApplication());
appState.data.UseAGetterOrSetterHere(); // Do whatever you need to with the data here.
Я обсуждаю это здесь, в моем сообщении в блоге, в разделе "Глобальный синглтон".
Ответ 2
Те, кто рассчитывает на экземпляр Application
, ошибаются. Во-первых, может показаться, что Application
существует до тех пор, пока весь процесс приложения существует, но это неверное предположение.
ОС может убивать процессы по мере необходимости. Все процессы разделены на 5 уровней "killability" указанных в документе.
Так, например, если ваше приложение переходит в фоновом режиме из-за того, что пользователь отвечает на входящий вызов, тогда в зависимости от состояния ОЗУ ОС может (или не может) убить ваш процесс (уничтожая Application
в процессе).
Я думаю, что лучше использовать сохранить ваши данные во внутреннем файле хранилища, а затем прочитать его, когда ваша активность возобновится.
UPDATE:
У меня появилось много отрицательных отзывов, поэтому пришло время добавить разъяснения.:) Ну, изначально я действительно использовал неправильное предположение, что состояние действительно важно для приложения. Однако, если ваше приложение в порядке, то иногда состояние теряется (это могут быть некоторые изображения, которые будут только перечитаны/перезаписаны), тогда все в порядке, чтобы сохранить его как член Application
.
Ответ 3
Если вы хотите получить доступ к "Global Singleton" за пределами действия, и вы не хотите передавать Context
через все задействованные объекты для получения синглтона, вы можете просто определить статический атрибут в своем классе приложения, в котором содержится ссылка на себя. Просто инициализируйте атрибут в методе onCreate()
.
Например:
public class ApplicationController extends Application {
private static ApplicationController _appCtrl;
public static ApplicationController getAppCtrl()
{
return _appCtrl;
}
}
Поскольку подклассы Application
также могут получать ресурсы, вы можете получить к ним доступ просто, когда вы определяете статический метод, который возвращает их, например:
public static Resources getAppResources()
{
return _appCtrl.getResources();
}
Но будьте предельно осторожны при прохождении ссылок Context на избежать утечек памяти.
Ответ 4
Дэйв, какие данные это? Если это общие данные, относящиеся к приложению в целом (пример: данные пользователя), затем расширьте класс приложения и сохраните его там. Если данные относятся к Activity, вы должны использовать обработчики onSaveInstanceState и onRestoreInstanceState для сохранения данных при вращении экрана.
Ответ 5
Вы действительно можете переопределить функциональность ориентации, чтобы убедиться, что ваша деятельность не уничтожена и не воссоздана. Посмотрите здесь.
Ответ 6
Я нашел хороший пример, почему мы не должны использовать глобальный объект в классе приложения. Примеры
Надеюсь, это поможет вам.
Ответ 7
Вы можете создать класс приложения и сохранить все данные на этих листах для использования в любом месте приложения.