본문 바로가기
안드로이드/Activity

안드로이드 객체 전달

by 김어찐 2022. 6. 9.
728x90

Parcelabel

Intent 를 통해 객체를 전달 할 때는 객체 직렬화를 해야 하는데 안드로이드는 Parcelable 인터페이스를 사용한다.
Parcelable 인터페이스는 전달 받은 쪽에서 객체를 복원할 때 필요한 정보를 가진 부분을 의미한다.  

 

 

메인 액티비티

package com.example.activityobject

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.activity_second.*

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}\n"
                textView.append("obj2.data1 ; ${obj2?.data2}")
            }
        }
    }
}

 

세컨드 액티비티

package com.example.activityobject

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*
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")

        textView2.text = "obj1.data1 : ${obj1?.data1}\n"
        textView2.append("obj1.data2 : ${obj1?.data2}")

        button2.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()
        }
    }
}

 

전달하는 오브젝트

package com.example.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에 담는 작업을 할 경우 호출되는 메서드
    // 객체가 intent에 저장되는 것이 아닌 객체를 구성하는 변수의 값이 저장된다.
    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeInt(data1)
        parcel.writeString(data2)
    }

    override fun describeContents(): Int {
        return 0
    }

    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)
        }
    }
}
728x90