안드로이드 학습(Kotlin)

Intent의 개념과 활용

리저브콜드브루 2025. 2. 24. 10:11
728x90
반응형

Intent

  • Intent는 Android에서 컴포넌트 간(예: Activity, Service, BroadcastReceiver)의 통신을 담당하는 객체
  • 다른 화면으로 이동하거나 데이터를 전달할 때 사용

 

 

Explicit Intent (명시적 인텐트)

  • 특정 컴포넌트를 직접 지정하여 실행하는 방식
  • 예: 같은 앱 내부에서 Activity 간 이동

 

예제: 명시적 인텐트로 Activity 전환

val intent = Intent(this, SecondActivity::class.java)
startActivity(intent)

SecondActivity로 화면을 전환

 

 

예제: 데이터 전달과 함께 Activity 전환

val intent = Intent(this, SearchActivity::class.java)
intent.putExtra("city_name", "Seoul")
startActivity(intent)

 

 

예제: Service 시작

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

 

 

예제: BroadcastReceiver 실행

val intent = Intent(this, MyReceiver::class.java)
sendBroadcast(intent)

Implicit Intent (암시적 인텐트)

  • 특정 컴포넌트를 직접 지정하지 않고, Andoird 시스템이 해당하는 앱을 찾아서 실행하는 방식
  • 예: 웹페이지 열기, 전화 걸기, 지도 보기, 카메라 실행 등

 

예제: 웹페이지 열기

val intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://www.google.com"))
startActivity(intent)

 

 

예제: 전화 걸기

val intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:01012345678"))
startActivity(intent)

 

 

예제: 지도 열기

val intent = Intent(Intent.ACTION_VIEW, Uri.parse("geo:37.7749,-122.4194"))
startActivity(intent)

 

 

예제: 갤러리에서 이미지 선택

val intent = Intent(Intent.ACTION_PICK)
intent.type = "image/*"
startActivityForResult(intent, REQUEST_IMAGE_PICK)

 

 

예제: 카메라 실행

val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
startActivity(intent)

Intent를 이용한 데이터 전달

  • 기본 데이터 전달 (putExtra)
  • Activity 간 데이터를 전달할 때 사용

 

예제: MainActivity에서 SearchActivity로 데이터 전달

val intent = Intent(this, SearchActivity::class.java)
intent.putExtra("city_name", "Seoul")
intent.putExtra("temperature", 22)
startActivity(intent)

 

예제: SearchActivity에서 데이터 받기

val cityName = intent.getStringExtra("city_name")
val temperature = intent.getIntExtra("temperature", 0) // 기본값 0

 

 

복잡한 데이터 전달 (Parcelable & Serializable)

  • 객체를 전달할 때는 Parcelable 또는 Serializable을 사용

 

예제: Parcelable을 사용한 데이터 전달

@Parcelize
data class CityWeather(val cityName: String, val temperature: Int) : Parcelable
val cityWeather = CityWeather("Seoul", 22)
val intent = Intent(this, SearchActivity::class.java)
intent.putExtra("weather", cityWeather)
startActivity(intent)
val cityWeather = intent.getParcelableExtra<CityWeather>("weather")

Intent로 결과받기 (startActivityForResult)

  • 결과를 받아와야할 때 사용 (예: 갤러리에서 사진 선택)

 

예제: GalleryActivity 실행 후 결과받기

val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
startActivityForResult(intent, REQUEST_IMAGE_PICK)

 

예제:  onActivityResult에서 결과 처리

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == REQUEST_IMAGE_PICK && resultCode == RESULT_OK) {
        val imageUri: Uri? = data?.data
        imageView.setImageURI(imageUri)
    }
}

 

startActivityForResult는 Activity Result API로 대체 가능

val getContent = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? ->
    imageView.setImageURI(uri)
}
getContent.launch("image/*")

Intent를 이용한 브로드캐스트 (sendBroadcast)

  • BroadcastReceiver를 통해 앱 전체에서 특정 이벤트를 감지하 수 있다

 

예제: 브로드캐스트 송신

val intent = Intent("com.example.weatherapp.WEATHER_UPDATE")
sendBroadcast(intent)

 

예제: AndroidManifest.xml에서 Receiver 등록

<receiver android:name=".WeatherUpdateReceiver">
    <intent-filter>
        <action android:name="com.example.weatherapp.WEATHER_UPDATE" />
    </intent-filter>
</receiver>

 

예제: 브로드캐스트 리시버 코드

class WeatherUpdateReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        Toast.makeText(context, "날씨 업데이트됨!", Toast.LENGTH_SHORT).show()
    }
}

 

728x90
반응형