Parcelable
- Intent를 통해 객체를 전달 할 때는 객체 직렬화를 해야 하는데 안드로이드는 Parcelable 인터페이스를 사용한다.
- Parcelable 인터페이스는 전달 받은 쪽에서 객체를 복원할 때 필요한 정보를 가진 부분을 의미한다.
package com.sypark.activityobject
import android.os.Parcel
import android.os.Parcelable
class TestClass() :Parcelable {
var data1:Int = 0
var data2:String? = ""
constructor(parcel: Parcel) : this() {
data1 = parcel.readInt()
data2 = parcel.readString()
}
// putExtra를 이용해 객체를 인텐트에 담는 작업을 할 경우 호출되는 메서드
// 객체가 intent에 저장되는 것이 아닌 객체를 구성하는 변수의 값이 저장된다.
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeInt(data1)
parcel.writeString(data2)
}
override fun describeContents(): Int {
return 0
}
//companion -> java에서 static
// getParcelableExtra를 호출해서 객체를 추출하려고 하면 자동으로 호출되는 메서드
// 새로운 객체를 생성하고 parcel에 저장되어 있는 데이터를 추출해 객체의 변수에 담아준다.
companion object CREATOR : Parcelable.Creator<TestClass> {
override fun createFromParcel(parcel: Parcel): TestClass {
return TestClass(parcel)
}
override fun newArray(size: Int): Array<TestClass?> {
return arrayOfNulls(size)
}
}
}
package com.sypark.activityobject
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
val SECOND_ACTIVITY = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener {
val second_intent = Intent(this,SecondActivity::class.java)
val t1 = TestClass()
t1.data1 = 100
t1.data2 = "문자열"
second_intent.putExtra("obj1",t1)
startActivityForResult(second_intent,SECOND_ACTIVITY)
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if(requestCode==SECOND_ACTIVITY){
if(resultCode== RESULT_OK){
//객체를 추출한다.
val obj2 = data?.getParcelableExtra<TestClass>("obj2")
textView.text = "obj2.data1:${obj2?.data1}"
textView.append("obj2.data1:${obj2?.data2}")
}
}
}
}
package com.sypark.activityobject
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import kotlinx.android.synthetic.main.activity_second.*
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
val obj1 = intent.getParcelableExtra<TestClass>("obj1")
textView1.text = "obj1.data1:${obj1?.data1}\n"
textView1.append("obj1.data2:${obj1?.data2}")
button1.setOnClickListener {
val t2 = TestClass()
t2.data1 = 200
t2.data2 = "문자열2"
val result_intent = Intent()
result_intent.putExtra("obj2",t2)
setResult(RESULT_OK,result_intent)
finish()
}
}
}
정리
- Intent를 통해 객체를 전달할 때는 Parcelable 인터페이스를 구한 클래스의 객체만 전달이 가능하다.
'2022년' 카테고리의 다른 글
Activity Action (0) | 2021.10.21 |
---|---|
Intent Filter (0) | 2021.10.20 |
데이터 전달하기 (0) | 2021.10.20 |
onActivityResult (0) | 2021.10.20 |
Activity실행하기 (0) | 2021.10.20 |