[안드로이드] Intent와 Bundle은 무엇일까?
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