Использование класса приложения Android для сохранения данных

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

Ответ 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

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