Пример учебника по использованию общих настроек Android

В этом руководстве мы будем использовать Shared Preferences в нашем приложении Android для хранения данных в форме пары ключ-значение.

Обзор Android Shared Preferences

Shared Preferences позволяет активностям и приложениям сохранять настройки в виде пар ключ-значение, аналогичных Map, которые сохраняются даже при закрытии приложения пользователем. Android сохраняет настройки Shared Preferences в виде XML-файла в папке shared_prefs внутри каталога DATA/data/{application package}. К каталогу DATA можно получить доступ, вызвав Environment.getDataDirectory(). SharedPreferences является специфичным для приложения, то есть данные теряются при выполнении одного из следующих действий:

  • при удалении приложения
  • при очистке данных приложения (через Настройки)

Как следует из названия, основная цель – сохранять уточненные пользователем конфигурационные данные, такие как настройки пользователя, чтобы пользователь оставался в системе после закрытия приложения. Для доступа к настройкам у нас есть три API на выбор:

  • getPreferences() : используется в пределах вашей Activity для доступа к настройкам, специфичным для активности
  • getSharedPreferences() : используется в пределах вашей Activity (или другого контекста приложения) для доступа к настройкам на уровне приложения
  • getDefaultSharedPreferences() : используется в PreferenceManager для получения общих настроек, которые работают в сочетании с общей структурой предпочтений Android

В этом учебнике мы будем использовать getSharedPreferences(). Метод определен следующим образом: getSharedPreferences (String PREFS_NAME, int mode) PREFS_NAME – это имя файла. mode – режим работы. Ниже приведены применимые режимы работы:

  • MODE_PRIVATE: режим по умолчанию, при котором созданный файл может быть доступен только вызывающему приложению
  • MODE_WORLD_READABLE: Создание файлов, доступных для чтения всем, очень опасно и может вызвать уязвимости в приложениях
  • MODE_WORLD_WRITEABLE: Создание файлов, доступных для записи всем, очень опасно и может вызвать уязвимости в приложениях
  • MODE_MULTI_PROCESS: Этот метод будет проверять модификацию настроек, даже если экземпляр Shared Preference уже был загружен
  • MODE_APPEND: Это добавит новые настройки к уже существующим настройкам
  • MODE_ENABLE_WRITE_AHEAD_LOGGING: Флаг открытия базы данных. Если установлен, это позволит включить журналирование записей по умолчанию

Инициализация

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

SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", 0); // 0 - for private mode
Editor editor = pref.edit();

Сохранение данных

editor.commit() используется для сохранения изменений в общих настройках.

editor.putBoolean("key_name", true); // Storing boolean - true/false
editor.putString("key_name", "string value"); // Storing string
editor.putInt("key_name", "int value"); // Storing integer
editor.putFloat("key_name", "float value"); // Storing float
editor.putLong("key_name", "long value"); // Storing long
 
editor.commit(); // commit changes

Получение данных

Данные можно получить из сохраненных настроек, вызвав getString() следующим образом:

pref.getString("key_name", null); // getting String
pref.getInt("key_name", -1); // getting Integer
pref.getFloat("key_name", null); // getting Float
pref.getLong("key_name", null); // getting Long
pref.getBoolean("key_name", null); // getting boolean

Очистка или удаление данных

remove(“имя_ключа”) используется для удаления определенного значения. clear() используется для удаления всех данных

editor.remove("name"); // will delete key name
editor.remove("email"); // will delete key email
 
editor.commit(); // commit changes
editor.clear();
editor.commit(); // commit changes

Структура проекта

Код проекта Shared Preferences для Android

Макет activity_main.xml состоит из двух представлений EditText, в которых хранятся и отображаются имя и электронная почта. Три кнопки реализуют свои соответствующие onClick в MainActivity.

<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    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" >

    <Button
        android:id="@+id/btnSave"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:onClick="Save"
        android:text="Save" />

    <Button
        android:id="@+id/btnRetr"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:onClick="Get"
        android:text="Retrieve" />

    <Button
        android:id="@+id/btnClear"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignRight="@+id/etEmail"
        android:layout_centerVertical="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:onClick="clear"
        android:text="Clear" />

    <EditText
        android:id="@+id/etEmail"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="Email"
        android:inputType="textEmailAddress"
        android:layout_below="@+id/etName"
        android:layout_marginTop="20dp"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

    <EditText
        android:id="@+id/etName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="Name"
        android:inputType="text"
        android:layout_alignParentTop="true"
        android:layout_alignLeft="@+id/etEmail"
        android:layout_alignStart="@+id/etEmail" />

</RelativeLayout>

Файл MainActivity.java используется для сохранения и извлечения данных по ключам.

package com.journaldev.sharedpreferences;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {
    SharedPreferences sharedpreferences;
    TextView name;
    TextView email;
    public static final String mypreference = "mypref";
    public static final String Name = "nameKey";
    public static final String Email = "emailKey";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        name = (TextView) findViewById(R.id.etName);
        email = (TextView) findViewById(R.id.etEmail);
        sharedpreferences = getSharedPreferences(mypreference,
                Context.MODE_PRIVATE);
        if (sharedpreferences.contains(Name)) {
            name.setText(sharedpreferences.getString(Name, ""));
        }
        if (sharedpreferences.contains(Email)) {
            email.setText(sharedpreferences.getString(Email, ""));

        }

    }

    public void Save(View view) {
        String n = name.getText().toString();
        String e = email.getText().toString();
        SharedPreferences.Editor editor = sharedpreferences.edit();
        editor.putString(Name, n);
        editor.putString(Email, e);
        editor.commit();
    }

    public void clear(View view) {
        name = (TextView) findViewById(R.id.etName);
        email = (TextView) findViewById(R.id.etEmail);
        name.setText("");
        email.setText("");

    }

    public void Get(View view) {
        name = (TextView) findViewById(R.id.etName);
        email = (TextView) findViewById(R.id.etEmail);
        sharedpreferences = getSharedPreferences(mypreference,
                Context.MODE_PRIVATE);

        if (sharedpreferences.contains(Name)) {
            name.setText(sharedpreferences.getString(Name, ""));
        }
        if (sharedpreferences.contains(Email)) {
            email.setText(sharedpreferences.getString(Email, ""));

        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Надуваем меню; это добавляет элементы в панель действий, если она присутствует.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

}

mypreference – это имя файла, где хранится пара ключ-значение общих предпочтений. Ниже показан окончательный результат нашего проекта: Это завершает этот учебник. Вы можете скачать проект Shared Preferences для Android по следующей ссылке.

Скачать пример проекта Shared Preferences для Android

Source:
https://www.digitalocean.com/community/tutorials/android-shared-preferences-example-tutorial