CS/Android

Intent

졔졔311 2025. 3. 4. 15:53
728x90
반응형

앱개발을 하던 중, 인터페이스/인텐트에 대해 알려달라는 요청을 받아 이게 무슨 말인지 찾아보게 되었다.

인터페이스는 알겠는데, 인텐트는 처음 들어봤다.

두 개를 함께 말씀하신거 보면, 비슷한 용도라는 건데, 궁금해서 조사하였다!

 

ㅇ Intent란?

Android component(Activity, Service, Broadcast 등)를 실행하거나 데이터를 전달하는 데 사용되는 객체.

내외부 application과 통신할 때도 사용.

- 로그인 화면에서 메인 화면으로 전환하는 등 Activity 간 전환에 사용

- 백그라운드 음악을 재생하는 등 Service 실행에 사용

- 배터리 부족 경고 등 Broadcast 메시지 전달에 사용

- 카메라 앱을 실행하거나 웹 브라우저를 여는 등 외부 앱 기능 호출에 사용

 

ㅇ Intent의 종류

1. 명시적 Intent

- 같은 앱 내에서 특정 component를 지정할 때 사용

- 주로 Activity나 Service 실행을 위해 사용

val intent = Intent(this, <activity나 service>)
startActivity(intent)

 

2. 암시적 Intent

- 특정 component를 명식적으로 지정하지 않고, android 시스템이 적절한 앱을 찾아 실행해줌

- 앱 간 데이터 공유나 외부 기능을 활요할 때 사용함

val intent = Intent(Intent.ACTION_VIEW, Uri.parse(<uri>))
startActivity(intent)

-> 사용자의 기본 웹 브라우저에서 Google 페이지가 열림

 

OR

 

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

-> 카메라 앱이 실행됨

ㅇ Intent를 활용한 데이터 전달

1. 기본 데이터 전달

- 데이터 보내는 쪽 : 

val intent = Intent(this, <Activity>)
intent.putExtra("key", "data")
startActivity(intent)

 

- 데이터 받는 쪽 (위에서 작성한 <Activity>에 해당하는 쪽) : 

val key = intent.getStringExtra("key")

 

2. 객체 데이터 전달

객체를 전달하기 위해서는 Serializable이나 Parcelable을 사용해야 한다.

Serialiable보다 Parcelable을 사용하는 것이 성능이 더 좋다.

- Serializable을 사용할 경우

data class User(val name: String, val age: Int) : Serializable

val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("user", User("John", 25))
startActivity(intent)

 

- Parcelable을 사용할 경우

@Parcelize
data class User(val name: String, val age: Int) : Parcelable

val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("user", User("John", 25))
startActivity(intent)

 

** serializable보다 parcelable이 성능이 더 좋은 이유?

더보기

1. serializable은 Java의 기본 직렬화 기능을 사용한다.

이때, Reflection을 활용하는데 reflection이 런타임에 객체의 필드와 메서드를 찾아서 변환하는 과정이 필요하기 때문에 오버헤드가 크다.

2. serializable은 GC 부하가 크다.

데이터를 직렬화할 때 임시 객체를 여러 개 생성하면서 처리하므로 Garbage Collection 부하가 증가하고, 따라서 앱 성능이 저하된다.

반면에 Parcelable은 데이터를 직접 ByteStream으로 변환해서 저장하므로 GC 부하가 적다.

3. Parcelable은 IPC 최적화 되어 있다.

Android의 Binder(프로세스 간 통신)를 최적화한 방식으로, Parcel 클래스를 이용해 메모리를 직접 읽고 쓰기 때문에 빠른 데이터 처리가 가능하다.

 

정리하자면,

Java에서 Serializable을 기본 제공하므로 일반 java 프로젝트에서는 Serializable을 사용하는 것이 좋다.

또한, 객체를 파일/네트워크로 저장할 경우 유지보수가 쉬운 Serializable이 더 유용하다.

간단한 데이터 직렬화에는 사용이 간편한 Serializable이 권장된다.

 

반면에,

Android에서 객체를 전달할 때는 속도가 빠르고 성능이 최적화된 Parcelable을 사용하는 것이 좋고,

Nested Class를 포함한 복잡한 객체 직렬화에서도 Parcelable이 성능상 유리하다.

 

ㅇ Activity 결과 반환

갤러리에서 이미지를 선택하고 결과를 가져오는 것처럼 다른 Activity에서 결과를 받아오는 기능을 추가할 수 있다.

1. secondActivity에서 데이터 반환

val resultIntent = Intent()
resultIntent.putExtra("result", "Success")
setResult(Activity.RESULT_OK, resultIntent)
finish()

-> "result" 데이터를 담아 이전 Activity로 전달한다.

 

2. MainActivity에서 결과 받기

val launcher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        val data = result.data?.getStringExtra("result")
        Log.d("TAG", "Received: $data")  // "Success"
    }
}

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

-> secondActivity에서 받은 "result" 데이터를 처리한다.

 

 

 

출처 : [Android] 인텐트(intent)란? / 컨텍스트(Context) /명시적 인텐트, 암시적 인텐트, 인텐트 필터

728x90
반응형

'CS > Android' 카테고리의 다른 글

Compose의 표준 레이아웃 요소 - Column, Row, Box  (0) 2025.03.05
Service (with. WorkManager, AlarmManager)  (0) 2025.03.04
Component  (1) 2025.02.28
Android Studio build 방법 - Make Project (Ctrl+F9)와 Build APK(s)  (0) 2025.02.25
Retrofit  (1) 2025.02.16