В этом уроке мы будем использовать SharedPreferences для хранения пользовательских данных в виде пар ключ-значение.
SharedPreferences в Android. Теория
SharedPreferences позволяют приложениям сохранять настройки в виде пар ключ-значение. Эти настройки сохраняются даже когда пользователь закрывает приложение.
Android хранит SharedPreferences в виде XML файла в папке shared_prefs по адресу data --> data --> [имя пакета] -->. Папку data можно получить с помощью вызова метода Environment.getDataDirectory().
SharedPreferences зависят от приложения, то есть сохраненные данные будут удалены из Android устройства после удаления приложения или после очистки данных приложения.
Обзор API SharedPreferences
Android предоставляет три метода получения доступа к SharedPreferences:
- Метод
getPreferences()используется внутри Activity для доступа к одному общему файлу настроек приложения. - Метод
getSharedPreferences()используется внутри Activity для доступа к разным файлам настроек приложения. - Метод
getDefaultSharedPreferences()используется классомPreferenceManager, чтобы получить доступ к стандартному файлу настроек.
В этом уроке мы познакомимся с методом getSharedPreferences() подробнее.
Этот метод используется следующим образом:
|
1 |
getSharedPreferences (String prefs_name, int mode) |
где prefs_name — имя файла, а mode — способ получения доступа.
Всего Android предоставляет несколько способов получения доступа:
- MODE_PRIVATE — режим по умолчанию, где созданный файл может быть доступен только вызывающему приложению
- MODE_WORLD_READABLE — создание файлов, к которым могут получить доступ на чтение из любого другого приложения (опасный метод, который часто приводит к проблемам в безопасности приложения)
- MODE_WORLD_WRITEABLE — создание файлов, к которым могут получить доступ (чтение и запись) из любого другого приложения.
- MODE_MULTI_PROCESS был помечен как deprecated в
Android API 23, так как не работал правильно в некоторых версиях Android и не был потокобезопасным. - MODE_APPEND — добавляет новые настройки к уже существующим.
SharedPreferences в Android. Практика
Начиная с этого урока мы будем выносить текст или названия виджетов, используемых в макете в файл strings.xml, который находится в папке res/values вашего проекта. Это является хорошей практикой программирования под Android, которой мы будем следовать. Вот файл strings.xml для нашего проекта:
|
1 2 3 4 5 6 |
<resources> <string name="app_name">SharedPreferencesApp</string> <string name="save_txt">Сохранить</string> <string name="retrieve_txt">Получить</string> <string name="clear">Очистить</string> </resources> |
Макет activity_main.xml состоит из одного виджета EditText и трех кнопок для сохранения, очистки и получения пользовательских данных из SharedPreferences:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="ua.com.prologistic.sharedpreferencesapp.MainActivity"> <Button android:id="@+id/saveBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_alignTop="@+id/clearBtn" android:onClick="onClick" android:text="@string/save_txt" /> <Button android:id="@+id/getBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignEnd="@+id/editName" android:layout_alignRight="@+id/editName" android:layout_below="@+id/editName" android:onClick="onClick" android:text="@string/retrieve_txt" /> <Button android:id="@+id/clearBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/editName" android:layout_centerHorizontal="true" android:onClick="onClick" android:text="@string/clear" /> <EditText android:id="@+id/editName" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:inputType="text" /> </RelativeLayout> |
Обратите внимание, что мы назначили в атрибуте onClick один и тот же метод. Ниже в листинге класса MyActivity.class вы увидите как мы обрабатываем нажатия для каждой кнопки:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
package ua.com.prologistic.sharedpreferencesapp; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private SharedPreferences sharedPrefs; private EditText editText; public static final String myPrefs = "myprefs"; public static final String nameKey = "nameKey"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText = (EditText) findViewById(R.id.editName); // при старте проверяем есть ли в файлах настроек // данные по ключу nameKey sharedPrefs = getSharedPreferences(myPrefs, Context.MODE_PRIVATE); if (sharedPrefs.contains(nameKey)) { // если есть, то ставим значение этого ключа в EditText editText.setText(sharedPrefs.getString(nameKey, "")); } } // метод для сохранения текста в файл настроек public void saveText() { // получаем текст String editTextValue = editText.getText().toString(); // получаем доступ к файлу SharedPreferences.Editor editor = sharedPrefs.edit(); // сохраняем по текст из EditText по ключу nameKey editor.putString(nameKey, editTextValue); editor.apply(); } // метод для получения текста из SharedPreferences по ключу public void getText() { sharedPrefs = getSharedPreferences(myPrefs, Context.MODE_PRIVATE); if (sharedPrefs.contains(nameKey)) { editText.setText(sharedPrefs.getString(nameKey, "")); } } // получаем id нажатого виджета и вызываем соответственный ему метод @Override public void onClick(View v) { int id = v.getId(); switch (id) { case R.id.saveBtn: // сохраняем текст в файл настроек saveText(); Toast.makeText(this, "Сохранить", Toast.LENGTH_LONG).show(); break; case R.id.clearBtn: // очищает текст в виджете EditText editText.setText(""); Toast.makeText(this, "Очистить", Toast.LENGTH_LONG).show(); break; case R.id.getBtn: // получаем текст из SharedPreferences Toast.makeText(this, "Получить", Toast.LENGTH_LONG).show(); getText(); break; } } } |
Обратите внимание, что мы реализуем интерфейс View.OnClickListener и переопределяем метод onClick(), в котором с помощью оператора switch находим id виджета, который был нажат. В макете activity_main.xml именно этот метод мы назначили общим для всех кнопок.
Результат работы приложения сохранения настроек SharedPreferences в Android:
Как видим, на рисунку представлен ход выполнения операций: сначала пишем текст в поле (1), затем нажимаем Сохранить (2), потом нажимаем Очистить (3) и в конце тестируем получение настроек из SharedPreferences — нажимаем Получить (4).
На этом все, следите за обновлениями раздела программирование под Андроид и подписывайтесь на рассылку сайта!




