저장된 환경설정 값 사용 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를 사용 설정하려면 다음을 호출합니다. PreferenceManagersetPreferenceDataStore():

Kotlin

val preferenceManager = preferenceManager
preferenceManager.preferenceDataStore = dataStore

자바

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

특정 Preference에 대해 설정된 Datastore는 가 설정됩니다. 대부분의 경우 전체 계층 구조입니다