앱개발을 하던 중, 인터페이스/인텐트에 대해 알려달라는 요청을 받아 이게 무슨 말인지 찾아보게 되었다.
인터페이스는 알겠는데, 인텐트는 처음 들어봤다.
두 개를 함께 말씀하신거 보면, 비슷한 용도라는 건데, 궁금해서 조사하였다!
ㅇ 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) /명시적 인텐트, 암시적 인텐트, 인텐트 필터
'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 |