
안드로이드 애플리케이션에서 4대 컴포넌트 구성 요소들 간에 통신에 사용되는 객체인 `Intent`를 개발하면서 많이 사용했었습니다.
문득, Intent가 어떤 식으로 동작하는지가 궁금해져 이번 게시글에서 이를 알아보고자 합니다.
Intent에 대한 기본적인 내용은 이 게시글에서는 다루지 않습니다. 만약 해당 내용이 필요하시다면 아래의 게시글을 참고해 주세요.
Android의 Intent (인텐트)
인텐트란?인텐트는 안드로이드 애플리케이션에서 4대 컴포넌트 구성 요소들 간에 통신하는 데 사용되는 객체입니다. 인텐트는 Activity를 실행하는 데 가장 많이 사용되지만 다른 용도도 있습니
everyday-develop-myself.tistory.com
1. Intent란?
Intent는 단순하게 말하면 내가 원하는 작업을 요청하기 위한 "편지봉투"입니다.
안드로이드에서는 우리는 우리가 원하는 작업을 Intent라는 메시지 객체에 담아서 안드로이드 시스템에게 요청하게 됩니다. 이는 다르게 말하면 Intent는 안드로이드 시스템과 통신하는 데 사용되는 객체라는 것을 의미합니다.
1.1. 액티비티 시작
먼저 액티비티를 시작하는 경우를 보겠습니다. 우리는 실행시키길 원하는 액티비티를 Intent로 정의합니다.
<kotlin />
val intent = Intent(packageContext: Context, class: Class<?>)
이 Intent는 `startActivity(Intent)`를 통해서 ActivityManager라고 하는 안드로이드 시스템 의 컴포넌트로 전달됩니다.

ActivityManager는 액티비티들이 쌓이는 스택을 관리하여 새로운 액티비티를 시작하거나, 필요에 따라 제거할 수 있습니다.
2. 액티비티의 Intent
각각의 액티비티 객체들은 기본적으로 내부에 Intent를 가지고 있습니다. 이 객체는 ActivityManager에 의해 액티비티가 attach 될 때, 할당됩니다.
<java />
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
final void attach(Context context, ActivityThread aThread,
...
Intent intent,
...
IBinder shareableActivityToken) {
...
mIntent = intent;
mReferrer = referrer;
...
}
할당된 액티비티의 Intent 객체는 Activity 클래스의 `getIntent()` 메서드를 통해 얻을 수 있으며,
<java />
public Intent getIntent() {
return mIntent;
}
이는 Kotlin에서 제공하는 getter 연산자 덕분에 간단하게 `intent`로 얻을 수 있습니다.
<kotlin />
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 액티비티의 Intent
val intent = intent // val intent = getIntent()
}
}
3. Intent Extra로 데이터 전달
Intent를 통해서 데이터를 전달할 수도 있습니다. 이는 Intent 객체에 있는 `Extras`라는 Bundle로 전달됩니다.
<java />
private Bundle mExtras;
`Extras`는 Intent 클래스 내부에 있는 다양한 메서드에 의해 키와 값의 구조로 저장됩니다.
<code />
public @NonNull Intent putExtra(String name, @Nullable String value) {
if (mExtras == null) {
mExtras = new Bundle();
}
mExtras.putString(name, value);
return this;
}
저장된 값 또한 다양한 메서드에 의해 가져올 수 있습니다.
<code />
public Object getExtra(String name, Object defaultValue) {
Object result = defaultValue;
if (mExtras != null) {
Object result2 = mExtras.get(name);
if (result2 != null) {
result = result2;
}
}
return result;
}
3.1. 정리하자면
Intent 객체는 액티비티를 시작하거나 다른 컴포넌트 간에 데이터를 전달하기 위한 메시지 역할을 하며, 이는 ActivityManager에 의해 처리됩니다. Intent 내부에 포함된 Extras를 통해 추가적인 데이터를 전달할 수 있어, 액티비티 간에 필요한 정보를 교환할 수 있게 됩니다.
여기까지 잘 따라오셨으면 Intent는 attach될 때 초기화 된다는 것을 아셨을 겁니다.
다만 여기서 문제가 있습니다. attach는 액티비티의 객체가 생성되고 `onCreate()`되기 전에 실행되기 때문에 이미 액티비티가 `onCreate()`된 상태에서는 액티비티가 가지고 있는 Intent 객체를 초기화할 수 없게 됩니다.
그렇기 때문에 이미 실행 중인 액티비티를 새로운 Intent로 재시작하려면 onNewIntent()가 필요합니다. 이 메서드는 액티비티가 이미 실행 중일 때 새로운 Intent가 전달되면 호출되어, 새로운 데이터를 처리하거나 액티비티를 재구성할 수 있도록 도와줍니다.
onCreate()와는 달리, onNewIntent()는 액티비티가 다시 시작되지 않고 기존 인스턴스가 그대로 유지되면서 새로운 Intent를 받아 처리하게 됩니다.
<kotlin />
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
// 새로운 Intent에서 데이터를 가져와 처리
val newData = intent?.getStringExtra("new_data")
// 새 데이터를 사용하여 UI를 갱신하거나 처리
}
5. Reference
인텐트 및 인텐트 필터 | Android Developers
이 페이지는 Cloud Translation API를 통해 번역되었습니다. 인텐트 및 인텐트 필터 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Intent는 다른 앱 구성요소로부
developer.android.com
[Android] Intent: 액티비티 간 데이터 전달
인텐트(intent)는 컴포넌트가 운영체제와 통신하는 데 사용할 수 있는 객체다. 지금까지 보았던 컴포넌트는 액티비티뿐이지만, 컴포넌트에는 서비스, 브로드캐스트 수신자, 콘텐츠 제공자도 있다
june0122.github.io
'Android' 카테고리의 다른 글
안드로이드에서 Context가 존재하는 이유 (2) | 2025.03.13 |
---|---|
안드로이드 멀티 모듈에서 의존성 항목 추가하기 api vs implementation (0) | 2024.08.25 |
Xml, Compose 그리고 명령형과 선언형 (0) | 2024.03.08 |
그냥 지나쳤던 안드로이드의 크기 단위 (0) | 2024.02.02 |
안드로이드에서 사용자의 위치를 가져오는 방법 (1) | 2024.01.07 |