자바에서 객체를 전달할 때 직렬화인 Serializable을 사용하여 데이터를 넘겨준다
안드로이드에서는 Parcelable를 사용할 것을 권장하고 있다.
하지만 권장하기 때문에 알고있어야 한다고 생각해서 연습삼아 간단하게 intent를 통해 사용해보았다.
data class의 객체를 Parcelable을 통해서 Intent로 간단하게 전달해보자.
핵심은 data class User이다.
data class가 Parcelable을 implements해줘야한다. 그리고 필수코드를 구현해주면 된다.
처음형태는 위와 같고, 이제 : Parcelable을 통해 구현해주자.
이렇게 : Parcelable
을 붙여주면, Parcelable interface를 implements 할 수 있다.
이제 class User 아래 처럼 빨간줄에 마우스를 올리면 아래 사진처럼 implements method라는 문구를 볼 수 있는데 이를 클릭해서 필수 메소드를 구현해주자
그렇게 하고 나면 이렇게 구현되지 않은 interface의 메소드가 나오게 된다.
여기서 한번 빨간줄을 클릭해서 method를 implements했는데도 빨간줄이 남아서 더 add해야할 코드가 있을 수 있으니까 혹시 빨간줄이 또 생긴다면 다시 해서 모든 method를 불러오시면 됩니다.
이제 아래와 같이 간단히 구현만 하면 된다.
우리가 직접 read와 write가 중요한데, 사실상 말그대로 객체를 읽고 쓰는 개념이라고 보면된다. 때문에 아래 사진처럼 구현해주면 된다.
이제 data class 구현은 모두 끝났고,
binding을 한 후에 버튼을 클릭하면 임의로 만들어진 User객체를 SubActivity로 전달하는 코드를 구현해준다.
SubActivity에서는 textView에 넘겨받은 intent를 그대로 User타입으로 받아서 "User"로 넘겨받았으니 해당 값을 꺼내서 toString()으로 text에 넘겨주기만 하면 결과를 볼 수 있다.
MainActivity
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.mainButton.setOnClickListener {
val intent = Intent(this, SubActivity::class.java)
// parcelable을 이용해서 객체를 넘겨줌.
intent.putExtra("User", User("Nick seven", 21))
startActivity(intent)
}
}
}
SubActivity
class SubActivity : AppCompatActivity() {
private lateinit var binding: ActivitySubBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivitySubBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.subTv.text = intent.getParcelableExtra<User>("User").toString()
}
}
data class User
data class User(var name: String?, var age: Int) : Parcelable {
constructor(parcel: Parcel) : this(
parcel.readString(),
parcel.readInt()
)
override fun describeContents(): Int {
return 0
}
override fun writeToParcel(dest: Parcel?, flags: Int) {
dest?.writeString(name)
dest?.writeInt(age)
}
companion object CREATOR : Parcelable.Creator<User> {
override fun createFromParcel(parcel: Parcel): User {
return User(parcel)
}
override fun newArray(size: Int): Array<User?> {
return arrayOfNulls(size)
}
}
}