본문 바로가기
2022년

객체 전달하기

by 박상윤 2021. 10. 20.

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