이 글 에서 액티비티 사이에서 Intent 로 데이터를 주고 받았다.
intent 관련 코드를 보자.
intent.putExtra("title", song.title)
intent.putExtra("singer", song.singer)
intent.putExtra("isPlaying", song.isPlaying)
보내야 할 song 객체의 정보가 3가지이다.
그런데 웬걸, 코딩을 하다보니 song 객체에 넣어야 할 값이 점점 많아졌다.
//song.kt
data class Song(
var title : String = "",
var singer : String = "",
var totalTime : Int = 0,
var currentTime : Int = 0,
var isPlaying : Boolean = false,
var musicFile : String = ""
)
현재의 Song 데이터클래스 상태이다. 6가지라니,...
intent로는 객체를 바로 전송할 수 없기에 처음에는 값 하나하나를 일일이 다 넣어줬다.
그런데 하다보니 너무 비효율적이라는 생각이 들어서 알아 본 결과,,,,
Google 에서 제공하는 Gson 라이브러리가 있었다.
Gson은 Json 데이터를 좀 더 효율적으로 가공하고 관리할 수 있도록 도와주는 라이브러리이다.
우리는 Gson 을 통해 Song 객체를 Json string 형태로 바꾼 뒤에 intent 객체에 담아 줄 예정이다.
// SongActivity.kt
class SongActivity : AppCompatActivity() {
private var song : Song = Song()
private lateinit var jsonSong : String
// song 객체를 json 형태로 변환해서 저장 (string으로 저장)
private var gson : Gson = Gson()
override fun onBackPressed(){
intent = Intent(this, MainActivity::class.java)
jsonSong = gson.toJson(song)
intent.putExtra("jsonSong", jsonSong)
setResult(RESULT_OK, intent)
finish()
}
}
song 객체를 gson.toJson(song) 코드를 통해 Json 형태로 변환 해 준다.
변환 한 결과값의 변수 타입은 String 형태이므로 intent로 String 을 보내 준다고 생각하면 된다.
//MainActivity.kt
getResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if(result.resultCode == RESULT_OK) {
Log.d("intent에 담겨온 data", "${result.data!!}") //result.data 를 intent 라고 생각
//intent에 담겨온 data: Intent { cmp=com.example.flo/.MainActivity (has extras) }
jsonSong = result.data!!.getStringExtra("jsonSong")!!
Log.d("jsonSong","$jsonSong")
// jsonSong: {"currentTime":128872,"isPlaying":false,"musicFile":"lilac","singer":"아이유(IU)","title":"LILAC","totalTime":216000}
song = gson.fromJson(jsonSong, Song::class.java)
Log.d("song객체", "$song")
// Song(title=LILAC, singer=아이유(IU), totalTime=216000, currentTime=128872, isPlaying=false, musicFile=lilac)
}
}
MainActivity 에서 registerForActivityResult 를 통해 반환받은 값을 LogCat을 통해 확인 해 보았다.
String 값을 보냈으므로 getStringExtra 를 통해 String 값을 jsonSong 변수에 담아주었다.
그 이후, gson.fromJson(jsonSong, Song::class.java) 코드를 통해 JSON 형태의 String 값을 Song 객체 형태로 변환해서 지정해준다.
추가적으로 나중에 JSON 타입의 데이터를 파싱하는 경우가 많은데,
- JSON 타입의 문자열 데이터라면 JSONObject() 를 통해,
- JSON 타입의 배열 데이터라면 JSONArray() 를 통해 파싱한다.
나중에 필요하면 추가적인 포스팅을 하도록 하겠다.
'안드로이드 > [Kotlin]' 카테고리의 다른 글
[Kotlin] 다른 Activity의 변수, 함수 사용하기 (0) | 2021.11.06 |
---|---|
[Kotlin] Seekbar 간단설명 (2) | 2021.10.29 |
[Kotlin] Worker Thread(작업 스레드) & Handler를 활용한 UI 처리 (0) | 2021.10.29 |
[Kotlin] registerForActivityResult() 사용법 (Feat. startActivityForResult 의 deprecated) (0) | 2021.10.25 |
[Kotlin] ViewPager2 & TabLayout (Feat. FragmentStateAdatper, TabLayoutMediator) (0) | 2021.10.24 |