저장된 값 사용 Android Jetpack의 구성요소
이 주제에서는 환경설정 라이브러리에서 저장한 Preference
값을 저장하고 사용하는 방법을 설명합니다.
환경설정 데이터 저장소
이 섹션에서는 Preference
가 데이터를 유지하는 방법을 설명합니다.
SharedPreferences
기본적으로 Preference
는 SharedPreferences
를 사용하여 값을 저장합니다. 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
용 맞춤 데이터 저장소를 사용 설정하려면 아래 예와 같이 Preference
의 setPreferenceDataStore()
를 호출합니다.
Kotlin
val preference: Preference? = findPreference("key") preference?.preferenceDataStore = dataStore
자바
Preference preference = findPreference(“key”); if (preference != null) { preference.setPreferenceDataStore(dataStore); }
전체 계층 구조용 맞춤 데이터 저장소를 사용 설정하려면 PreferenceManager
의 setPreferenceDataStore()
를 호출합니다.
Kotlin
val preferenceManager = preferenceManager preferenceManager.preferenceDataStore = dataStore
자바
PreferenceManager preferenceManager = getPreferenceManager(); preferenceManager.setPreferenceDataStore(dataStore);
특정 Preference
용으로 설정된 데이터 저장소는 대응하는 계층 구조용으로 설정된 모든 데이터 저장소를 재정의합니다. 대부분의 경우 전체 계층 구조용 데이터 저장소를 설정해야 합니다.