안녕하세요,
Android에서 값을 저장하는데 사용하는 SharedPreference 를 통해 동적으로 변화하는 값을 관찰하는 방법에 대해 작성해보겠습니다.
목표 -> SettingFragment에서 특정 값이 변경되면 MainActivity의 UI의 변화
이슈 -> MainActivity의 FragmentContainer에 하위 프래그먼트들이 종속(OneActivity - MultiFragment 구조) 되어 있기 때문에 생명주기를 이용한 데이터 전달 방법으로는 실시간 반영이 힘듬.
해결 방안 ->
- Interface를 사용한 콜백 방식
- ViewModel과 LiveData
- Event Bus 사용
- Local Broadcast Receiver
- Shared Preferences와 OnSharedPreferenceChangeListener
이렇게 5가지 정도의 해결 방안들을 파악했고,
설정에 관련된 정보는 device내에 저장을 하는 경우가 많기 때문에 5번 방식으로 포스팅 해보겠습니다.
Shared Preferences를 클래스를 만들어 필요한 데이터를 저장할 수 있도록 준비합니다.
저장해야되는 데이터에 Shared Preferences를 사용해 데이터를 저장합니다.
데이터를 사용해야하는 곳에서 OnSharedPreferenceChangeListener 해당 함수를 사용해 데이터가 변할때마다 반응하는 리스너를 등록합니다.
private SharedPreferences.OnSharedPreferenceChangeListener preferenceChangeListener;
private void setupSharedPreferencesListener() {
preferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (SettingPreference.On_Off.equals(key)) {
updateUIBasedOn();
}
}
};
settingPreference.getSharedPreferences().registerOnSharedPreferenceChangeListener(preferenceChangeListener);
}
@Override
protected void onDestroy() {
super.onDestroy();
settingPreference.getSharedPreferences().unregisterOnSharedPreferenceChangeListener(preferenceChangeListener);
appFinish();
}
간략하게 이러한 순서로 이루어지고 Android에서 기본 설정이 변경될 때 호출할 콜백을 제공해주기 때문에 쉽게 구현이 가능합니다.
이 방식을 사용하면 Fragment와 Activity간의 직접적인 연결이 커뮤니케이션 없이 상태 변경을 관리할 수 있는 장점이 있습니다.
https://developer.android.com/reference/android/content/SharedPreferences