저장된 값 사용   Android Jetpack의 구성요소

이 주제에서는 환경설정 라이브러리에서 저장한 Preference 값을 저장하고 사용하는 방법을 설명합니다.

환경설정 데이터 저장소

이 섹션에서는 Preference가 데이터를 유지하는 방법을 설명합니다.

SharedPreferences

기본적으로 PreferenceSharedPreferences를 사용하여 값을 저장합니다. SharedPreferences API를 사용하면 애플리케이션 세션에 걸쳐 저장된 파일에서 간단한 키-값 쌍을 읽고 쓸 수 있습니다. 환경설정 라이브러리는 비공개 SharedPreferences 인스턴스를 사용하므로 애플리케이션만 인스턴스에 액세스할 수 있습니다.

예를 들어 다음과 같은 SwitchPreferenceCompat가 있다고 가정합니다.

<SwitchPreferenceCompat
        app:key="notifications"
        app:title="Enable message notifications"/>

사용자가 이 스위치를 On 상태로 전환하면 SharedPreferences 파일은 "notifications" : "true"의 키-값 쌍으로 업데이트됩니다. 사용되는 키는 Preference에 설정된 키와 동일합니다.

SharedPreferences API에 관한 자세한 내용은 키-값 데이터 저장을 참고하세요.

Android에 데이터를 저장하는 다양한 방법에 관한 자세한 내용은 데이터 및 파일 저장소 개요를 참고하세요.

PreferenceDataStore

환경설정 라이브러리는 기본적으로 SharedPreferences를 사용하여 데이터를 유지하지만 SharedPreferences가 항상 이상적인 해결 방법은 아닙니다. 예를 들어, 애플리케이션에 사용자 로그인이 필요하다면 설정이 다른 기기 및 플랫폼에 반영되도록 클라우드에 애플리케이션 설정을 유지하고 싶을 수도 있습니다. 마찬가지로 애플리케이션에 기기별 구성 옵션이 있다면 기기의 각 사용자가 별도의 설정을 가지게 되며 SharedPreferences는 이상적인 해결 방법이 아닙니다.

PreferenceDataStore를 사용하면 맞춤 저장소 백엔드를 사용하여 Preference 값을 유지할 수 있습니다. 자세한 내용은 맞춤 데이터 저장소 사용을 참조하세요.

환경설정 값 읽어오기

사용 중인 SharedPreferences 객체를 가져오려면 PreferenceManager.getDefaultSharedPreferences()를 호출합니다. 이 메서드는 애플리케이션의 모든 위치에서 작동합니다. 다음과 같이 'signature'라는 키를 사용하는 EditTextPreference를 예로 들어보겠습니다.

<EditTextPreference
        app:key="signature"
        app:title="Your signature"/>

Preference에 저장된 값은 다음과 같이 전역에서 가져올 수 있습니다.

Kotlin

val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this /* Activity context */)
val name = sharedPreferences.getString("signature", "")

자바

SharedPreferences sharedPreferences =
        PreferenceManager.getDefaultSharedPreferences(this /* Activity context */);
String name = sharedPreferences.getString(“signature”, "");

환경설정 값의 변경사항 수신 대기

Preference 값의 변경사항을 수신 대기하려면 다음 두 개의 인터페이스 중에서 선택하면 됩니다.

아래 표는 두 인터페이스의 차이점을 보여줍니다.

OnPreferenceChangeListener OnSharedPreferenceChangeListener
환경설정별로 설정됩니다. 모든 환경설정에 적용됩니다.
환경설정에서 저장된 값을 변경하려고 할 때 호출되며 대기 중인 값이 현재 저장된 값과 동일한 경우를 포함합니다. 환경설정에 저장된 값이 변경된 경우에만 호출됩니다.
환경설정 라이브러리를 통해서만 호출됩니다. 애플리케이션의 별도 부분이 저장된 값을 변경할 수 있습니다. 저장된 값이 변경될 때마다 호출되며, 애플리케이션의 별도 부분에서 변경한 경우도 해당됩니다.
대기 중인 값이 저장되기 전에 호출됩니다. 이미 값이 저장된 후 호출됩니다.
SharedPreferences 또는 PreferenceDataStore 사용 시 호출됩니다. SharedPreferences 사용 시에만 호출됩니다.

OnPreferenceChangeListener

OnPreferenceChangeListener를 구현하면 Preference의 값이 변경되려고 하는 때를 수신 대기할 수 있습니다. 여기에서 이 변경이 필요한지 검증할 수 있습니다. 예를 들어, 아래 코드는 'name'이라는 키를 사용하는 EditTextPreference 값의 변경사항을 수신 대기하는 방법을 보여줍니다.

Kotlin

override fun onPreferenceChange(preference: Preference, newValue: Any): Boolean {
    Log.e("preference", "Pending Preference value is: $newValue")
    return true
}

자바

@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
    Log.e("preference", "Pending Preference value is: " + newValue);
    return true;
}

다음으로 이 리스너를 다음과 같이 setOnPreferenceChangeListener()를 사용하여 직접 설정해야 합니다.

Kotlin

preference.onPreferenceChangeListener = ...

자바

preference.setOnPreferenceChangeListener(...);

OnSharedPreferenceChangeListener

SharedPreferences를 사용하여 Preference 값을 유지한다면 SharedPreferences.OnSharedPreferenceChangeListener를 사용하여 변경사항을 수신 대기할 수도 있습니다. 이렇게 하면, Preference에 저장된 값이 변경될 때(예: 서버와 설정을 동기화)를 수신 대기할 수 있습니다. 아래의 예는 'name'이라는 키를 사용하는 EditTextPreference 값이 변경되는 때를 수신 대기하는 방법을 보여줍니다.

Kotlin

override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) {
    if (key == "signature") {
        Log.i(TAG, "Preference value was updated to: " + sharedPreferences.getString(key, ""))
    }
}

자바

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    if (key.equals(“signature”)) {
        Log.i(TAG, “Preference value was updated to: “ + sharedPreferences.getString(key, ""));
    }
}

또한 아래와 같이 registerOnSharedPreferenceChangedListener()를 통해 리스너를 등록해야 합니다.

Kotlin

preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(...)

자바

getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(...);

Kotlin

val listener: SharedPreferences.OnSharedPreferenceChangeListener =
        SharedPreferences.OnSharedPreferenceChangeListener {...}

자바

SharedPreferences.OnSharedPreferenceChangeListener listener =
        new SharedPreferences.OnSharedPreferenceChangeListener() {...}

Activity 또는 Fragment에서 수명 주기를 올바르게 관리하기 위해 아래와 같이 onResume()onPause() 콜백에서 이 리스너를 등록 및 등록 취소해야 합니다.

Kotlin

override fun onResume() {
    super.onResume()
    preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(this)
}

override fun onPause() {
    super.onPause()
    preferenceManager.sharedPreferences.unregisterOnSharedPreferenceChangeListener(this)
}

자바

@Override
public void onResume() {
    super.onResume();
    getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}

@Override
public void onPause() {
    super.onPause();
    getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}

맞춤 데이터 저장소 사용

SharedPreferences를 사용하여 Preference 객체를 유지하는 것이 좋기는 하지만 맞춤 데이터 저장소를 사용할 수도 있습니다. 예를 들어, 맞춤 데이터 저장소는 애플리케이션이 값을 데이터베이스에 유지하거나 값이 기기별로 저장될 때 유용합니다.

데이터 저장소 구현

맞춤 데이터 저장소를 구현하려면 먼저 PreferenceDataStore를 확장한 클래스를 만듭니다. 아래는 String 값을 처리하는 데이터 저장소를 만드는 예입니다.

Kotlin

class DataStore : PreferenceDataStore() {
    override fun putString(key: String, value: String?) {
        // Save the value somewhere
    }

    override fun getString(key: String, defValue: String?): String? {
        // Retrieve the value
    }
}

자바

public class DataStore extends PreferenceDataStore {
    @Override
    public void putString(String key, @Nullable String value) {
        // Save the value somewhere
    }
    @Override
    @Nullable
    public String getString(String key, @Nullable String defValue) {
        // Retrieve the value
    }
}

사용자 인터페이스를 차단하지 않으려면 기본 스레드가 아닌 곳에서 시간 소모가 많은 작업을 실행해야 합니다. 값을 유지하는 동안 데이터 저장소를 포함하는 Fragment 또는 Activity가 제거될 수 있기 때문에 사용자가 변경한 값을 잃어버리지 않도록 데이터를 직렬화해야 합니다.

데이터 저장소 사용 설정

데이터 저장소를 구현한 후에는 Preference 객체가 기본 SharedPreferences를 사용하는 대신 데이터 저장소를 사용하여 값을 유지하도록 onCreatePreferences()에 새 데이터 저장소를 설정해야 합니다. 데이터 저장소는 각 Preference 또는 전체 계층 구조에서 사용 설정될 수 있습니다.

특정 Preference용 맞춤 데이터 저장소를 사용 설정하려면 아래 예와 같이 PreferencesetPreferenceDataStore()를 호출합니다.

Kotlin

val preference: Preference? = findPreference("key")
preference?.preferenceDataStore = dataStore

자바

Preference preference = findPreference(“key”);
if (preference != null) {
    preference.setPreferenceDataStore(dataStore);
}

전체 계층 구조용 맞춤 데이터 저장소를 사용 설정하려면 PreferenceManagersetPreferenceDataStore()를 호출합니다.

Kotlin

val preferenceManager = preferenceManager
preferenceManager.preferenceDataStore = dataStore

자바

PreferenceManager preferenceManager = getPreferenceManager();
preferenceManager.setPreferenceDataStore(dataStore);

특정 Preference용으로 설정된 데이터 저장소는 대응하는 계층 구조용으로 설정된 모든 데이터 저장소를 재정의합니다. 대부분의 경우 전체 계층 구조용 데이터 저장소를 설정해야 합니다.