Google은 흑인 공동체를 위한 인종 간 평등을 진전시키기 위해 노력하고 있습니다. Google에서 어떤 노력을 하고 있는지 확인하세요.

저장된 값 사용

저장된 값 사용 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는 이상적인 해결 방법이 아닙니다.

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용 맞춤 데이터 저장소를 사용 설정하려면 아래 예와 같이 의 setPreferenceDataStore()를 호출합니다.

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용으로 설정된 데이터 저장소는 대응하는 계층 구조용으로 설정된 모든 데이터 저장소를 재정의합니다. 대부분의 경우 전체 계층 구조용 데이터 저장소를 설정해야 합니다.