Intent 란?
앱 구성요소(Component)로부터 작업을 요청하는 데 사용할 수 있는 시스템에 전달하는 메시지 객체.
메시지 객체는 통신을 위한 객체로 인텐트를 통해서 다른 앱 구성요소로 메시지를 통해 요청을 전달 한다.
앱 구성요소는 Activity, Service, Broadcast receiver, Content Provider 로 4가지로 이루어져 있지만 인텐트를 사용할 수 있는 구성요소는 Activity, Service, Broadcast Receiver 만 가능 하다.
Intent를 통한 컴포넌트 간 통신 ?
1. Activity
Activity는 앱의 단일 화면을 나타낸다. Intent를 startActivity()에 전달하여 Activity의 새 인스턴스를 시작 할 수 있다.
Intent는 시작할 활동을 설명하고 필요한 데이터를 전달한다.
새로 시작한 인스턴스가 완료 되었을 때 결과를 수신하려면 startActivityForResult()를 호출한다. Activity는 해당 결과를 Activity의 onActivityResult() 콜백에서 별도의 Intent 객체로 수신한다.
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
2. Service
Service는 UI 없이 백그라운드에서 작업을 실행하는 컴포넌트이다.
Intent를 startService()에 전달하고 서비스를 시작하여 일회성 작업(예:파일 다운로드)을 실행 할 수 있다.
Intent는 시작할 서비스를 설명하고 모든 필수 데이터를 담고 있다.
Intent intent = new Intent(
getApplicationContenxt(), // 현재 제어권자
MainService.class // 이동할 컴포넌트
);
startService(intent);
Service가 클라이언트 - 서버 인터페이스로 디자인 된 경우, 다른 컴포넌트로부터 서비스에 binding 하려면 Intent를 bindService()에 전달하면 된다.
Intent intent = new Intent(
getApplicationContenxt(), // 현재 화면
MainService.class // 다음 컴포넌트
);
bindService(intent, conn, Context.BIND_AUTO_CREATE);
3. Broadcast Receiver
브로드캐스트는 모든 앱이 수신할 수 있는 메시지이다.
시스템은 시스템이 부팅될 때 또는 기기가 충전을 시작할 때 등 시스템 이벤트에 대한 다양한 broadcast를 전달한다.
Intent는 sendBroadcast() 또는 sendOrderedBroadcast()에 전달하여 다른 앱에 브로드캐스트를 전달 할 수 있다.
Intent 종류 ?
1. 명시적 인텐트
특정 ComponentName(앱의 패키지 이름 혹은 앱의 구성요소)을 지정하여 인텐트를 충족하는 앱 구성요소를 지정한다. 명시적 인텐트는 일반적으로 내부 앱의 컴포넌트를 시작할 때 사용한다.
시작하고자 하는 Activity 또는 Service의 클래스 이름을 알고 있다.
예를들어, 사용자 작업에 응답하여 앱 내에서 새 Activity를 시작하거나 백그라운드에서 파일을 다운로드 하기 위해 Service를 시작할 수 있다.
// 특정 클래스 이름을 알고 있는 경우로
// 새로운 Activity 시작
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
// 특정 앱의 패키지 이름을 알고 있는 경우
ComponentName componentName = new ComponentName(packageName,className);
Intent intent = new Intent();
intent.setComponent(componentName);
intent.putExtra("key","1234");
startActivity(intent)
2. 암시적 인텐트
특정 컴포넌트의 이름을 지정하지 않고, Intent-filter 내에 수행할 action을 선언하여 다른 앱의 컴포넌트가 이를 처리할 수 있도록 한다. 예를 들어 사용자에게 지도에 있는 한 위치를 표시하고자 하는 경우, 암시적 인텐트를 사용하여 해당 기능을 갖춘 다른 앱이 지정된 위치를 지도에 표시하도록 요청할 수 있다.

1) ActivityA가 action이 포함된 Intent를 생성하고 startActivity()를 호출하여 Android System에 전달한다.
2) 안드로이드 시스템이 모든 앱에서 해당 인텐트와 일치하는 인텐트 필터(Mainfiest 파일에 선언된)를 검색한다.
이때 호환된 인텐트 필터가 여러 개인 경우, 시스템 대화 상자를 표시하여 사용자가 어느 앱을 사용할지 직접 선택할 수 있다.
3) 일치하는 항목을 찾으면 시스템이 해당 액티비티의 onCreate() 메소드를 호출하여 Intent에 전달하고, 해당 액티비티를 시작한다.
Intent LifeCycle ?
💡 Intent(인텐트) 는 액티비티, 서비스, 브로드캐스트 리시버 간의 데이터를 전달하는 역할을 한다.
즉, Intent 자체에는 생명주기(Lifecycle)가 없지만, Intent를 통해 실행되는 액티비티나 서비스의 생명주기와 연결되어 있다. 따라서, Intent는 액티비티, 서비스, 브로드캐스트에서 어떻게 동작하는지가 중요한 점이다.
Intent와 Activity의 LifeCycle
🎯 Intent를 통해 액티비티를 시작할 때
📌 startActivity(intent)를 호출하면 새로운 액티비티의 생명주기가 시작 된다.
✔️ A 액티비티 → B 액티비티로 이동할 때 흐름
Intent intent = Intent(SubActivity.java)
startActivity(intent)
✔️ 실행 흐름
1️⃣ Intent가 생성됨
2️⃣ A 액티비티의 onPause() 실행됨 (잠시 멈춤)
3️⃣ B 액티비티의 onCreate() → onStart() → onResume() 실행됨
4️⃣ B 액티비티가 활성화됨 (A는 onStop() 상태로 대기)
✔️ B 액티비티를 종료하면?
1️⃣ BActivity에서 finish() 호출
2️⃣ B 액티비티의 onPause() → onStop() → onDestroy() 실행됨
3️⃣ A 액티비티의 onRestart() → onStart() → onResume() 실행됨 (다시 화면에 보임)
Intent와 서비스의 생명주기
🎯 Intent를 통해 서비스 시작.
📌 startService(intent) 또는 bindService(intent, connection, BIND_AUTO_CREATE)로 실행
✔️ start 방식 (독립 실행 서비스)
val intent = Intent(this, MyService::class.java)
startService(intent) // 서비스 시작
✔️ 실행 흐름
1️⃣ Intent가 생성됨
2️⃣ 서비스의 onCreate() → onStartCommand() 실행됨
3️⃣ 서비스가 백그라운드에서 실행됨
4️⃣ stopService() 또는 stopSelf()를 호출하면 onDestroy() 실행됨
✔️ bind 방식 (액티비티와 연결된 서비스)
val intent = Intent(this, MyService::class.java)
bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE)
✔️ 실행 흐름
1️⃣ Intent가 생성됨
2️⃣ 서비스의 onCreate() → onBind() 실행됨
3️⃣ 액티비티가 종료되면 자동으로 onUnbind() 실행됨
4️⃣ unbindService()를 호출하면 서비스가 종료됨 (onDestroy() 실행)
📌 즉, Intent는 서비스의 시작과 종료를 관리하는 역할을 함!
Intent와 브로드캐스트 리시버의 생명주기
🎯 Intent를 통해 브로드캐스트를 보낼 때
📌 sendBroadcast(intent), sendOrderedBroadcast(intent, permission) 사용
✔️ 브로드캐스트 보내기
val intent = Intent("MY_CUSTOM_ACTION")
sendBroadcast(intent)
✔️ 실행 흐름
1️⃣ Intent가 생성됨
2️⃣ 브로드캐스트 리시버의 onReceive() 실행됨
3️⃣ onReceive()가 끝나면 자동으로 종료됨 (생명주기 없음)
📌 즉, Intent는 브로드캐스트를 보내고 일회성으로 이벤트를 처리하는 역할을 함!
한 줄 정리
- Intent 자체에는 생명주기가 없지만, 액티비티, 서비스, 브로드캐스트의 생명주기를 제어하는 역할을 함!
- Intent를 통해 액티비티를 실행하면 액티비티의 생명주기가 시작됨!
- Intent를 통해 서비스를 실행하면 백그라운드 작업이 시작됨!
- Intent를 통해 브로드캐스트를 보내면 이벤트가 한 번 실행되고 종료됨!
'개발 > Android' 카테고리의 다른 글
| [Android] Service 정리 (0) | 2025.02.13 |
|---|---|
| [Android] Intent Filter 정리 (0) | 2025.02.12 |
| [Android] ViewModel 정리 (0) | 2025.02.11 |
| [Android] LiveData 정리 (0) | 2025.02.11 |
| [Android] 관찰자 패턴(Observer Pattern) (0) | 2025.02.11 |