저장된 환경설정 값 사용 Android Jetpack의 구성요소
이 문서에서는
다음에 의해 저장된 Preference
값
환경설정 라이브러리.
환경설정 데이터 저장소
이 섹션에서는 Preference
가 데이터를 유지하는 방법을 설명합니다.
SharedPreferences
기본적으로 Preference
는 다음을 사용합니다.
SharedPreferences
할인
값으로 사용됩니다. SharedPreferences
API는 간단한 읽기 및 쓰기를 지원합니다.
키-값 쌍을 생성할 수 있습니다. 이
환경설정 라이브러리는 비공개 SharedPreferences
인스턴스를 사용하므로
애플리케이션이 액세스할 수 있습니다.
예를 들어 다음과 같은 SwitchPreferenceCompat
가 있다고 가정합니다.
<SwitchPreferenceCompat app:key="notifications" app:title="Enable message notifications"/>
사용자가 이 스위치를 '사용'으로 전환하는 경우 상태, 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 |
---|---|
단일 Preference 에서 설정합니다. |
모든 Preference 객체에 적용됩니다. |
Preference 가 저장된 값을 변경하려고 할 때 호출됩니다.
대기 중인 값이 저장된 값과 동일하더라도 |
Preference 에 저장된 값이 변경될 때만 호출됩니다. |
Preference 라이브러리를 통해서만 호출됩니다. 별도의 파트
저장된 값을 변경할 수 있습니다. |
저장된 값이 변경될 때마다 호출됩니다. 별도의 애플리케이션의 일부일 수 있습니다 |
대기 중인 값이 저장되기 전에 호출됩니다. | 값이 저장된 후에 호출됩니다. |
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
에 저장된 값이 변경될 때를 수신 대기할 수 있습니다.
서버 간에 설정을 동기화할 때와 같이 다음 예는 다음을 실행하는 방법을 보여줍니다.
키를 사용하여 EditTextPreference
값의 변경을 수신 대기합니다.
"name"
:
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); }
커스텀 Datastore 사용
SharedPreferences
를 사용하여 Preference
객체를 유지하는 것이 좋지만
커스텀 데이터 스토어를 사용할 수도 있습니다 커스텀 Datastore는
애플리케이션이 값을 데이터베이스에 유지하거나 값이 기기별로 다른 경우
다음 예에 나와 있습니다.
데이터 저장소 구현
커스텀 데이터 스토어를 구현하려면 다음을 확장하는 클래스를 만듭니다.
PreferenceDataStore
다음 예에서는 kubectl run을 사용하여
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
가 가능하므로
값을 유지하는 동안 폐기해야 하는 데이터 저장소를 만들고 데이터를 직렬화하여
사용자가 변경한 값을 잃지 않습니다.
Datastore 사용 설정
데이터 스토어를 구현한 후에는
onCreatePreferences()
는 Preference
객체가 다음
Datastore의 기본 API인 SharedPreferences
를 사용합니다. GCP 콘솔에서
Datastore가 생성됩니다.Preference
특정 Preference
에 커스텀 Datastore를 사용 설정하려면 다음을 호출합니다.
setPreferenceDataStore()
(다음 예와 같이 Preference
)
Kotlin
val preference: Preference? = findPreference("key") preference?.preferenceDataStore = dataStore
자바
Preference preference = findPreference("key"); if (preference != null) { preference.setPreferenceDataStore(dataStore); }
전체 계층 구조에 대해 커스텀 Datastore를 사용 설정하려면 다음을 호출합니다.
PreferenceManager
의 setPreferenceDataStore()
:
Kotlin
val preferenceManager = preferenceManager preferenceManager.preferenceDataStore = dataStore
자바
PreferenceManager preferenceManager = getPreferenceManager(); preferenceManager.setPreferenceDataStore(dataStore);
특정 Preference
에 대해 설정된 Datastore는
가 설정됩니다. 대부분의 경우
전체 계층 구조입니다