[Android 앱 개발 심화] 1. SharedPreferences
SharedPreferences
- Preferences의 데이터(키-값 세트) 관리 클래스
- 응용 프로그램 내의 액티비티 간에 공유
(한 쪽 액티비티에서 수정 시, 다른 액티비티에도 수정된 값 읽기 가능)
- 응용 프로그램 외부에서 읽기 불가능
- 사용 가능한 데이터 타입:
공유 환경설정의 핸들 가져오기
- shared preference 파일 새로 생성/존재하는 파일 접근하는 방법:
(1) getSharedPreferences 메서드: 이름으로 구분되는 여러 개의 shared preference 파일이 필요한 경우 사용
(2) getPreferences 메서드: Activity에서 하나의 shared preference 파일이 필요한 경우 사용, 이름 지정할 필요 X
-> retrieves a default shared preference file that belongs to the activity
(3) getDefaultSharedPreference 메서드: 앱 전체 설정 저장이 필요한 경우 사용
-> retrieves a default shared preference file for your entire app
getSharedPreferences 메서드
val sharedPref = activity?.getSharedPreferences(
getString(R.string.preference_file_key), Context.MODE_PRIVATE)
- getSharedPreferences(name,mode)
- name: Preference 데이터를 저장할 XML 파일의 이름
- should use a name that's uniquely identifiable to your app
(-> prefix the file name with your application ID)
- mode: 파일 공유 모드
- MODE_PRIVATE: 호출한 애플리케이션 내부에서만 읽기 가능
getPreferences 메서드
val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE)
Write to shared preferences
- shared preference 파일을 편집하기
(1) SharedPreferences에 edit() 함수를 호출하여 SharedPreferences.Editor를 생성하기
(2) 키-값 쌍 함수로 저장하기 (ex.putInt(), putString())
(3) apply() 또는 commit() 함수를 호출하여 변경사항 저장하기
val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE) ?: return
with (sharedPref.edit()) {
putInt(getString(R.string.saved_high_score_key), newHighScore)
apply()
}
- apply(): changes the in-memory SharedPreferences object immediately but writes the updates to disk asynchronously
- commit(): write the data to disk synchronously
(-> should avoid calling from main thread)
Read from shared preferences
val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE) ?: return
val defaultValue = resources.getInteger(R.integer.saved_high_score_default_key)
val highScore = sharedPref.getInt(getString(R.string.saved_high_score_key), defaultValue)
예제
- 앱을 닫았다 열어도, EditText에 입력한 text가 남아있도록 하기
class MainActivity : AppCompatActivity() {
private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
binding.btnSave.setOnClickListener{
saveData()
Toast.makeText(this, "Data Saved.", Toast.LENGTH_SHORT).show()
}
loadData()
}
private fun saveData() {
val pref = getSharedPreferences("pref",0)
val edit = pref.edit()
edit.putString("name", binding.etHello.text.toString())
edit.apply()
}
private fun loadData() {
val pref = getSharedPreferences("pref",0)
binding.etHello.setText(pref.getString("name",""))
}
}