Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

Kotlin 인텐트로 안드로이드 액티비티 간 객체 전달하기 – 단계별 가이드

이 튜토리얼에서는 Kotlin에서 인텐트(Intent)를 활용해 한 안드로이드 액티비티(Activity)에서 다른 액티비티로 객체를 전달하는 방법을 단계별로 살펴봅니다.

인텐트에 객체를 담아 전달하려면 해당 클래스가 반드시 Serializable 또는 Parcelable 인터페이스를 구현해야 합니다. 이번 예제에서는 구현이 비교적 간단한 Serializable 방식을 사용합니다.

1단계: 새 프로젝트 만들기

Android Studio에서 File ⇒ New Project를 선택한 뒤, 필요한 정보를 모두 입력하여 새 프로젝트를 생성합니다.

2단계: activity_main.xml 레이아웃 작성

res/layout/activity_main.xml 파일에 아래 코드를 추가합니다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="70dp"
    android:background="#008080"
    android:padding="5dp"
    android:text="TutorialsPoint"
    android:textColor="#fff"
    android:textSize="24sp"
    android:textStyle="bold" />
<EditText
    android:id="@+id/editText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:hint="Enter your Message" />
<Button
    android:id="@+id/btnSendObj"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/editText"
    android:layout_centerInParent="true"
    android:layout_marginTop="15dp"
    android:text="Send Obj to 2nd Activity" />
</RelativeLayout>

3단계: MainActivity.kt 작성

src/MainActivity.kt에 다음 코드를 추가합니다. EditText에 입력된 메시지를 Message 객체에 담고, putExtra()로 인텐트에 추가한 후 SecondActivity로 전달합니다.

import android.content.Intent
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import androidx.appcompat.app.AppCompatActivity
import java.io.Serializable
class MainActivity : AppCompatActivity() {
    lateinit var editText: EditText
    lateinit var button: Button
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        title = "KotlinApp"
        editText = findViewById(R.id.editText)
        button = findViewById(R.id.btnSendObj)
        button.setOnClickListener {
            val intent = Intent(this@MainActivity, SecondActivity::class.java)
            val message = Message()
            message.setMessage(editText.text.toString())
            intent.putExtra("message", message)
            startActivity(intent)
        }
    }
}
class Message : Serializable {
    private var message: String? = null
    override fun toString(): String {
        return "$message"
    }
    fun setMessage(message: String?) {
        this.message = message
    }
    companion object {
        private const val serialVersionUID = 1L
    }
}

4단계: 두 번째 액티비티 생성

새로운 Empty Activity를 하나 만들고 아래와 같이 코드를 작성합니다.

activity_second.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="70dp"
        android:background="#008080"
        android:padding="5dp"
        android:text="TutorialsPoint"
        android:textColor="#fff"
        android:textSize="24sp"
        android:textStyle="bold" />
    <TextView
        android:textAlignment="center"
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:textColor="@android:color/holo_purple"
        android:textSize="24sp"
        android:textStyle="bold" />
</RelativeLayout>

SecondActivity.kt

SecondActivity에서는 getSerializableExtra()를 사용해 인텐트로 전달받은 Message 객체를 꺼내 TextView에 표시합니다.

import android.os.Bundle
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
class SecondActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)
        title = "KotlinApp"
        val textView: TextView = findViewById(R.id.textView)
        val intent = intent
        val message = intent.getSerializableExtra("message") as Message?
        textView.text = "$message"
    }
}

5단계: AndroidManifest.xml 설정

androidManifest.xml에 아래 코드를 추가합니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="com.example.q11">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

앱 실행하기

이제 애플리케이션을 실행해 보겠습니다. 실제 안드로이드 기기가 컴퓨터에 연결되어 있다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤, 툴바의 실행(Run) 아이콘 Kotlin 인텐트로 안드로이드 액티비티 간 객체 전달하기 – 단계별 가이드 을 클릭하세요. 옵션 목록에서 본인의 모바일 기기를 선택하면, 기기 화면에 기본 화면이 표시됩니다.

Kotlin 인텐트로 안드로이드 액티비티 간 객체 전달하기 – 단계별 가이드

Kotlin 인텐트로 안드로이드 액티비티 간 객체 전달하기 – 단계별 가이드

마무리 및 참고 사항

이렇게 하면 Serializable을 구현한 객체를 인텐트 부가 데이터(extra)에 담아 액티비티 간에 자유롭게 전달할 수 있습니다. 다만 대용량 데이터를 다루거나 성능이 중요한 경우에는 Android에 최적화된 Parcelable 인터페이스를 사용하는 것이 좋습니다. Kotlin에서는 @Parcelize 어노테이션을 활용하면 별도의 보일러플레이트 코드 없이 간편하게 Parcelable을 구현할 수 있습니다.