Главная » Разработка для Android » Сохранение состояния Активности из приложения To-Do List

0

На данном этапе каждый раз, когда приложение To-Do List перезапуска- ется, все элементы списка теряются, а любой текст, введенный  в текстовое поле, сбрасывается.  В этом примере1 вы начнете сохранять состояние при- ложения  To-Do List между сессиями.

Состояние экземпляра в Активности To-Do  List включает три перемен- ные, которые помогают понять:

был ли добавлен новый элемент;

какой текст находится в новом текстовом поле;

какой элемент списка сейчас выбран.

Используя Общие настройки  Активности по умолчанию,  можно хранить каждое из этих значений  и обновлять пользовательский интерфейс,  когда Активность перезапустят.

ПРИМЕЧАНИЕ

В следующей главе вы узнаете, как использовать базу данных SQLite для хранения элементов списка. Этот пример — первый шаг: показывается, как оставить у пользователя положительные впечатления от приложения, сохраняя данные экземпляра Активности.

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

private static final String TEXT_ENTRY_KEY = "TEXT_ENTRY_KEY"; private static final String ADDING_ITEM_KEY = "ADDING_ITEM_KEY"; private static final String SELECTED_INDEX_KEY = "SELECTED_INDEX_KEY";

1     Все фрагменты  кода в этом примере  — часть проекта Todo List из главы 6, их можно за- грузить с сайта Wrox.com.

2. Переопределите метод onPause.  Получите  приватный объект Общих настроек Активности и объект Editor.Используя ключи,  созданные в пункте 1, сохраните переменные  экземпляра Активности, учитывая добавление  нового элемента, а также сохраните текст из поля ввода new item:

@Override

protected void onPause(){

super.onPause();

// Получите объект настроек Активности. SharedPreferences uiState = getPreferences(0);

// Получите доступ к редактору настроек. SharedPreferences.Editor editor = uiState.edit();

// Добавьте в качестве настроек значения состояния пользовательского интерфейса.

editor.putString(TEXT_ENTRY_KEY, myEditText.getText().toString());

editor.putBoolean(ADDING_ITEM_KEY, addingNew);

// Сохраните настройки. editor.commit();

}

3. Создайте  метод restoreUIState, применяющий значения  экземпляра Активности, которые вы записали в предыдущем шаге, к приложению во время его перезапуска. Измените метод onCreate, добавив в самом конце вызов метода restoreUIState:

@Override

public void onCreate(Bundle savedInstanceState) { [ … Ранее написанный код … ] restoreUIState();

}

private void restoreUIState() {

// Получите объект настроек Активности.

SharedPreferences settings = getPreferences(Activity.MODE_PRIVATE);

// Извлеките значения состояния пользовательского интерфейса, укажите значения по умолчанию.

String text = settings.getString(TEXT_ENTRY_KEY, "");

Boolean adding = settings.getBoolean(ADDING_ITEM_KEY, false);

// Восстановите предыдущее состояние пользовательского интерфейса. if (adding) {

addNewItem();

myEditText.setText(text);

}

}

4. Запишите индекс выбранного элемента списка с помощью механизма onSaveInstanceState/onRestoreInstanceState. Далее он будет сохранен и восстановлен  только в том случае, если работа приложения завер- шится без явного участия пользователя:

@Override

public void onSaveInstanceState(Bundle savedInstanceState) {

savedInstanceState.putInt(SELECTED_INDEX_KEY, myListView. getSelectedItemPosition());

super.onSaveInstanceState(saveInstanceState);

}

@Override

public void onRestoreInstanceState(Bundle savedInstanceState) {

int pos = -1;

if (savedInstanceState != null)

if (savedInstanceState.containsKey(SELECTED_INDEX_KEY))

pos = savedInstanceState.getInt(SELECTED_INDEX_KEY, -1);

myListView.setSelection(pos);

}

Теперь при запуске приложения To-Do List вы должны увидеть, что со- стояние пользовательского интерфейса сохраняется между сессиями. Тем не менее приложение все еще не сохраняет элементы списка — вы добавите эту важную часть функционала в следующей главе.

Сохранение и загрузка файлов

Использование Общих настроек или базы данных для хранения информа- ции из вашего приложения — хорошее решение, но случается, что хочется работать с файлами  напрямую, а не полагаться  на механизмы  управления, предоставляемые платформой Android.

Наряду  со стандартными классами  и методами  Java, отвечающими за ввод/вывод, Android предоставляет методы openFileInput и openFileOutput для упрощения чтения и записи потоков, относящихся к локальным фай- лам, как показано в листинге 6.8.

Листинг 6.8. Сохранение и загрузка файлов

String FILE_NAME = "tempfile.tmp";

// Создайте новый исходящий файловый поток, который является приватным

// по отношению к данному приложению.

FileOutputStream fos = openFileOutput(FILE_NAME, Context.MODE_PRIVATE);

// Создайте новый входящий файловый поток. FileInputStream fis = openFileInput(FILE_NAME);

Эти методы поддерживают только те файлы,  которые находятся  в ка- талоге с текущим  приложением; указание  разделителей в пути приведет к выбросу исключения.Если при создании FileOutputStream файл, который вы указали, не существует, Android создаст его для вас. По умолчанию име- ющиеся файлы  перезаписываются. Чтобы добавить данные в конец суще- ствующего файла, установите режим Context.MODE_APPEND. По умол- чанию файлы, созданные с помощью метода openFileOutput, принадлежат

только текущему приложению,  другие приложения не будут иметь к нему доступ. Стандартный способ открыть доступ к файлу разным приложени- ям — использование класса ContentProvider. Еще один вариант — указать при создании файла режим Context.MODE_WORLD_READABLE или Context.MODE_WORLD_WRITEABLE, как показано в следующем фраг- менте кода:

String OUTPUT_FILE = "publicCopy.txt";

FileOutputStream fos = openFileOutput(OUTPUT_FILE, Context.MODE_WORLD_ WRITEABLE);

Включение статических файлов в качестве ресурсов

Если для приложения требуются ресурсы в виде внешних файлов, мо- жете включить их в дистрибутив, разместив в каталоге res/raw дерева вашего проекта. Чтобы получить доступ к ресурсам, предназначенным только для чтения, вызовите метод openRawResource, принадлежащий объекту Resource приложения. Таким образом, вы получите объект InputStream, основанный на указанном файле. В качестве имени переменной, принадлежащей R.raw, задайте имя файла (без расширения), как показано в следующем фрагменте:

Resources myResources = getResources();

InputStream myFile = myResources.openRawResource(R.raw.myfilename);

Добавление файлов к вашему дереву ресурсов можно назвать хорошей альтернативой при использовании больших, заведомо существующих  Ис- точников данных (таких,  как словари),  которые нежелательно (или  невоз- можно)  конвертировать в формат базы данных Android. Механизм  ресур- сов в Android  позволяет  указывать  альтернативные файлы  ресурсов  для различных  языков,  местностей  и конфигураций аппаратного  обеспече- ния. Например, вы можете создать приложение, которое загружает разные ресурсы со словарями,  основываясь на языковых  настройках,  указанных пользователем.

Инструменты для управления файлами

Android  содержит  некоторые  базовые  инструменты для управления файлами,  которые помогут вам при работе с файловой системой. Многие из них находятся  в стандартном  пакете java.io.File.

Полный  обзор инструментов управления файлами  в Java выходит  за рамки данной книги, но Android предлагает некоторые специализированные утилиты для этих целей, доступные через объект Context приложения.

deleteFile.  Позволяет удалять  файлы, созданные  текущим  приложе- нием.

fileList. Возвращает массив строк, в котором содержатся  все файлы, созданные текущим приложением.

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

Резюме

В этой главе вы узнали,  как хранить  простые  данные в рамках  при- ложения  и как управлять файлами  и настройками. После изучения того, как сохранять  данные экземпляра Активности между сессиями,  используя обработчики  сохранения  и восстановления состояния экземпляра класса, вы познакомились с Общими настройками и фреймворком для управления системными Экранами настроек. Они применялись для сохранения значений экземпляра приложения и пользовательских настроек, которые могли бы пригодиться для различных компонентов приложения.Вы также узнали, как:

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

включать в проект статические файлы в качестве внешних ресурсов. В следующей главе научитесь хранить более сложную и структуриро-

ванную информацию в рамках приложения. Наряду  с методами, описан- ными в этой главе, Android предоставляет доступ к полнофункциональным реляционным базам данных (используя библиотеку  базы данных SQLite), который может осуществляться из разных приложений с помощью Источ- ников данных. И SQLite, и Источники данных будут рассмотрены в следующей

главе.

Источник: Майер P. Android 2 : программирование приложений для планшетных компьютеров и смартфонов : [пер. с англ. ] / Рето Майер. — М. : Эксмо, 2011. — 672 с. — (Мировой компьютерный бестселлер).

По теме:

  • Комментарии