Использование класса приложения Android для сохранения данных - PullRequest
107 голосов
/ 17 ноября 2010

Я работаю над довольно сложным приложением Android, для которого требуется довольно большой объем данных о приложении (я бы сказал, всего около 500 КБ - это большое для мобильного устройства?). Из того, что я могу сказать, любое изменение ориентации в приложении (точнее, в деятельности) вызывает полное разрушение и воссоздание активности. Исходя из моих выводов, класс Application не имеет одинаковый жизненный цикл (т. Е. Он всегда создается для всех целей и задач). Имеет ли смысл хранить информацию о состоянии внутри класса приложения и затем ссылаться на нее из Activity, или это вообще не «приемлемый» метод из-за ограничений памяти на мобильных устройствах? Я очень ценю любые советы на эту тему. Спасибо!

Ответы [ 6 ]

131 голосов
/ 17 ноября 2010

Я не думаю, что 500Кб будет такой большой сделкой.

То, что вы описали, это именно то, как я решил мою проблему потери данных в действии.Я создал глобальный синглтон в классе 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.

Я обсуждаю это здесь, в моем блоге , в разделе «Глобальный синглтон».

56 голосов
/ 18 ноября 2010

Те, кто рассчитывает на Application экземпляр, ошибаются.Сначала может показаться, что Application существует до тех пор, пока существует весь процесс приложения, но это неверное предположение.

ОС может уничтожать процессы по мере необходимости.Все процессы разделены на 5 уровней «убиваемости» , указанных в документе .

Так, например, если ваше приложение работает в фоновом режиме из-за того, что пользователь отвечает на входящий вызов,затем, в зависимости от состояния ОЗУ, ОС может (или не может) уничтожить ваш процесс (уничтожив экземпляр Application в процессе).

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

ОБНОВЛЕНИЕ:

Я получил много отрицательных отзывов, так что пришло время добавитьуточнение.:) Ну, изначально я действительно использовал неверное предположение, что состояние действительно важно для приложения.Однако, если ваше приложение в порядке, что иногда состояние теряется (это могут быть некоторые изображения, которые будут просто перечитаны / перезагружены), тогда вполне нормально сохранить его как член Application.

6 голосов
/ 18 ноября 2010

Если вы хотите получить доступ к «Глобальному синглтону» вне действия и не хотите пропускать 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();
}

Но будьте очень осторожны при передаче контекстных ссылок на во избежание утечек памяти .

2 голосов
/ 18 ноября 2010

Дейв, что это за данные?Если это общие данные, которые относятся к приложению в целом (пример: пользовательские данные), то расширьте класс Application и сохраните его там.Если данные относятся к Activity, вы должны использовать обработчики onSaveInstanceState и onRestoreInstanceState, чтобы сохранить данные при повороте экрана.

1 голос
/ 17 ноября 2010

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

0 голосов
/ 03 июля 2015

Вы можете создать класс Application и сохранить все данные на этом запросе для использования в любом месте вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...