이전 글


이 글은 아래 링크의 글에서 이어지는 글이지만 인텐트를 이용한 액티비티 데이터 전달을 알고 있다면 보지 않아도 무방하다.

2021.06.07 - [언어, 라이브러리/Android] - [Android, Kotlin] 액티비티 데이터 전달(Intent)

 

 

데이터 클래스


코틀린에는 데이터클래스가 존재하는데, 이름에서 알 수 있듯이 데이터 관리가 주 목적인 클래스다. equals, toString과 같은 함수도 자동적으로 생성되고 사용이 간편해서 다수의 데이터를 액티비티 간 전달할 때 이용하는 편이다. 

 

 

액티비티 간 데이터 클래스 전달 구현


SendActivity에서 데이터클래스의 객체를 만들고 인텐트를 이용하여 객체를 ReceiveActivity로 전달한다.

 

SendActivity

package com.hydroponicglass.myapplication // 수정 필요

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import java.io.Serializable

data class Data (
    var name:String,
    var age:Int
) : Serializable

class SendActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_send)

        Log.d("Log","SendActivity")

        val data = Data("ha",20)
        val intent = Intent(this,ReceiveActivity::class.java)
        intent.putExtra("key",data) // key, 전달할값
        startActivity(intent);
    }
}

name과 age를 가지는 데이터클래스 Data를 SendActivity에 정의했다. 데이터클래스를 전달하기 위해서는 Serializable 혹은 Parcelable 과정을 거쳐 데이터를 변환해야 한다. 여기서는 Serializable를 사용한다.

 

ReceiveActivity

package com.hydroponicglass.myapplication // 수정필요

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log

class ReceiveActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_receive)

        Log.d("Log","ReceiveActivity")

        val data = intent.getSerializableExtra("key") as Data
        Log.d("Log","value : "+ data)
    }
}

데이터 클래스를 직렬화하여 전달했기 때문에 데이터를 받을 때도 getSerializableExtra를 이용하여 받아야 한다. 그리고 'as'를 이용하여 해당 데이터클래스로 캐스팅해줘야 한다. 꼭 해줘야 하나 싶긴 한데, 일단 내 경우는 안 해주면 에러가 발생했다.

 

Log

D/Log: SendActivity
D/Log: ReceiveActivity
D/Log: value : Data(name=ha, age=20)