안드로이드

[안드로이드] Intent와 Bundle은 무엇일까?

권송미 2024. 8. 25. 20:15
728x90
반응형

 

 

Activity에서 데이터를 주고 받다보면 Intent를 흔히 볼 수 있습니다.

 

 

 

 

 

 

 

 

 

Intent란 무엇일까요?

 

Intent는 Android에서 컴포넌트 간의 작업이나 데이터를 주고 받을 때 사용되는 메시징 객체입니다.

Android 앱 내에서 다양한 작업을 수행할 때 Intent가 중요한 역할을 합니다.

 

 

 

 

 

 

 

 

 

Intent의 역할

 

1. Activity간 전환

 

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle

class MainActivity : AppCompatActivity() {
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        val intent = Intent(this, SecondActivity::class.java)
        startActivity(intent)
    }
}

 

위처럼 MainActivity에서 SecondActivity로 전환할 수 있게 해줍니다.

 

 

 

 

 

 

2. 데이터 전송

 

- 데이터를 담아서 다른 Activity, Service, BroadcastReceiver로 전달할 수 있습니다.

 

 

 

 

예제 코드를 통해 알아봅시다.

 

 

MainActivity.kt

import android.annotation.SuppressLint
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button

class MainActivity : AppCompatActivity() {

    @SuppressLint("MissingInflatedId")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val button = findViewById<Button>(R.id.sendButton)
        button.setOnClickListener {
            val intent = Intent(this, SecondActivity::class.java)
            intent.putExtra("MESSAGE", "Hello ~~~~")
            startActivity(intent)
        }
    }
}

 

 

 

 

SecondActivity.kt

import android.annotation.SuppressLint
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView

class SecondActivity : AppCompatActivity() {
    @SuppressLint("MissingInflatedId")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)

        val textView = findViewById<TextView>(R.id.secondTV)
        val message = intent.getStringExtra("MESSAGE")
        textView.text = message
    }
}

 

 

 

 

 

 

버튼을 통해 SecondActivity로 Hello ~~~~ 를 전송하고 SecondActivity는 MainActivity에서 받은 String을 Text로 보여주게 만들었습니다.

 

 

 

 

 

 

 

 

실행하면 아래처럼 MainActivity에서 전송한 String을 SecondActivity에서 볼 수 있습니다.

 

 

 

 

 

3. Service, BroadcastReceiver 와의 통신

 

 

- Service

val serviceIntent = Intent(this, MyService::class.java)
startService(serviceIntent)

 

 

- BroadcastReceiver

val intent = Intent("com.example.a4components.CUSTOM_ACTION")
sendBroadcast(intent)

 

 

 

 

 

 

 

 

 

 

 

Bundle은 무엇일까요?

 

Bundle은 데이터를 저장하고 전달하는 역할로, 키- 값 쌍의 데이터를 저장하며, Intent의 extra로 추가하거나 Fragment의 arguments로 사용될 수 있습니다.

 

 

 

 

 

 

 

 

Bundle의 역할

 

1. 데이터 전달

 

- Activity간 데이터 전송 : Intent와 함께 사용하여 다른 activity로 데이터를 전달합니다.

- Fragment간 데이터 전송 : Fragment의 인스턴스를 생성할 때 Bundle을 사용하여 전달합니다.

 

 

 

Activity -> Fragment 데이터 전송 예제

 

MainActivity.kt

import android.annotation.SuppressLint
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle

class MainActivity : AppCompatActivity() {

    @SuppressLint("MissingInflatedId")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Bundle 데이터 전달
        val fragment = MyFragment().apply {
            arguments = Bundle().apply {
                putString("BUNDLE_MESSAGE", "Hello Bundle")
            }
        }

        supportFragmentManager.beginTransaction()
            .replace(R.id.fragmentContainer, fragment)
            .commit()
    }
}

 

 

MyFragment.kt

 

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView

class MyFragment : Fragment() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_my, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val message = arguments?.getString("BUNDLE_MESSAGE")
        view.findViewById<TextView>(R.id.fragmentRV).text = message
    }
}

 

 

 

이렇게 Bundle로 가져오면 아래처럼 Activity에서 보낸 메시지가 잘 나오는 것을 볼 수 있습니다.

 

 

 

2. 상태 저장 및 복원

 

- Activity onSaveInstanceState함수에서 상태를 저장할 수 있습니다.

 

 

3. Service와의 데이터 전달

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

그렇다면, Intent와 Bundle은 무슨 차이점이 있을까요?

 

 

 

 

1. 용도

 

- Intent는 컴포넌트 간의 상호작용을 위한 객체

- Bundle은 데이터를 저장하고 전달하는데 사용되는 데이터 구조

 

 

2. 데이터 전송

- Intent : 데이터를 putExtra 메서드로 전달

- Bundle : 데이터를 Bundle 객체에 저장하고, 이 Bundle 객체를 Intent의 putExtras로 전달

 

 

 

 

=> Intent는 Android 컴포넌트 간 상호작용을 위해 주로 사용 되고, Bundle은 데이터를 저장하고 전달하는 역할을 해줍니다 !

 

 

 

 

 

 

 

 

 

 

 

 

 

참고

https://developer.android.com/guide/components/intents-common?hl=ko

 

공통 인텐트  |  Android Developers

인텐트를 사용하면 인텐트 객체에서 실행할 작업 (예: '지도 보기' 또는 '사진 찍기')을 설명하여 다른 앱에서 활동을 시작할 수 있습니다. 이러한 유형의 인텐트를 암시적 인텐트라고 합니다. 그

developer.android.com

 

728x90
반응형