Android

(Android / Kotlin) - SharedPreferences

돗개진 2024. 4. 30. 21:15

 

[ 안드로이드 비휘발성 데이터 저장 방법 ]

 

: 비휘발성 데이터는 앱이 종료되어도 데이터가 남아 있고 다시 앱을 실행했을 때 해당 데이터를 다시 가져올 수 있는 것을 말한다.

 


 

[ Preference ]

 

SharedPreferences

- 프로그램 설정 정보 (ex: 알림 설정, 자동 로그인 설정 등...)

- XML 포맷의 텍스트 파일에 키-값 세트로 저장됨

- 외부에서 못 읽어들임 (응용 프로그램의 고유한 정보이므로)

=> 응용 프로그램 내의 액티비티 간에 공유하며 한쪽 액티비티에서 수정 시 다른 액티비티에서도 수정된 값을 읽을 수 있음

 

getSharedPreferences (name, mode)

- 여러개의 Shared Preferences 파일들을 사용하는 경우

- name : Preference data를 저장할 XML 파일의 이름이다

- mode : 파일의 공유 모드

       -> MODE_PRIVATE : 생성된 XML 파일은 호출한 애플리케이션 내에서만 읽기 쓰기가 가능

       -> MODE_WORLD_READABLE, MODE_WORLD_WRITEABLE 은 보안상 이유로 API level 17 에서 deprecated 됨

 

val sharedPref = activity?.getSharedPreferences(
        getString(R.string.preference_file_key), Context.MODE_PRIVATE)

ㄴ> getString 을 사용해서 putString 으로 전달한 데이터를 가져온다

 

 

- getSharedPreferences 는 대부분의 타입의 데이터를 사용할 수 있다

=> putBoolean / putFloat / putInt / putLong / putString / putStringSet

 

 

- SharedPreferences 클래스

=> 프로그램의 설정 정보 (사용자의 옵션 선택 사항이나 프로그램의 구성 정보) 를 영구적으로 저장하는 용도로 사용

 

package com.example.shared_preferences

import android.os.Bundle
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.example.shared_preferences.databinding.ActivityMainBinding

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 저장 성공", Toast.LENGTH_SHORT).show()
        }
        loadData()
    }

    // 데이터를 저장하는 함수
    private fun saveData() {
        val pref = getSharedPreferences("pref", 0)
        val edit = pref.edit() // pref의 수정 모드

        // putString 의 첫 번째 인자는 키, 두 번째 인자는 실제 데이터 값
        edit.putString("name", binding.etHello.text.toString())
        edit.apply() // 저장 완료
    }

    // 데이터를 불러오는 함수
    private fun loadData() {
        val pref = getSharedPreferences("pref", 0)
        // pref.getString()
        // 첫 번째 인자는 키, 두 번째 인자는 데이터가 존재하지 않을 경우의 값
        binding.etHello.setText(pref.getString("name", ""))
    }

}

ㄴ> saveData() 에는 데이터를 저장하고 loadData() 함수를 사용해서 데이터를 불러온다. loadData() 는 앱이 실행되는 onCreate() 때 같이 호출되며 이전에 저장했던 정보를 앱이 시작하는 시점에 가져와 정보를 유지할 수 있도록 한다.

 

 

 


 

 

 

[ 테스트 화면 ]

 

EditText를 만들어 text 입력 후 저장 버튼을 누르면 입력한 text를 저장하고 앱을 다시 열면 저장된 text가 그대로 유지될 수 있도록 간단하게 구현 (SharedPreferences 를 쓰지 않는 경우, text는 저장되지 않음)

 

앱을 실행하고 Data를 저장한 화면

 

 

앱을 종료하고 작업 관리자에서도 지운 뒤 다시 접속한 화면