안드로이드 4대 컴포넌트
안드로이드 애플리케이션은 주로 네 가지 주요 컴포넌트로 구성됩니다. 이들은 애플리케이션의 구조를 정의하고, 안드로이드 시스템과 어떻게 상호 작용하는지를 결정함
1. 액티비티 (Activity)
- 설명: 액티비티는 사용자가 직접 상호작용하는 화면을 말합니다. 예를 들어 이메일 앱에서는 이메일 목록을 보여주는 화면, 이메일 작성 화면 등이 각각 독립된 액티비티임
- 역할: 사용자 인터페이스(UI)를 담당하며, 사용자의 입력에 반응하는 이벤트 기반 프로그래밍을 가능하게 함
2. 서비스 (Service)
- 설명: 서비스는 백그라운드에서 오랜 시간 동안 실행되어야 하는 작업을 수행합니다. 예를 들어 음악 재생이나 파일 다운로드 등이 서비스로 처리됨
- 역할: 사용자가 직접적으로 인지하지 못하는, 애플리케이션의 '백스테이지'에서 일어나는 작업을 담당함
3. 브로드캐스트 리시버 (Broadcast Receiver)
- 설명: 브로드캐스트 리시버는 안드로이드 시스템으로부터 발송되는 다양한 이벤트나 정보를 애플리케이션이 받을 수 있게 해주는 컴포넌트임 예를 들어, 배터리 부족 경고, 화면 꺼짐 등의 시스템 이벤트를 처리할 때 사용됨
- 역할: 애플리케이션은 브로드캐스트 메시지를 구독하고, 해당 이벤트가 발생했을 때 반응할 수 있음
4. 콘텐트 프로바이더 (Content Provider)
- 설명: 콘텐트 프로바이더는 애플리케이션 간의 데이터 공유를 가능하게 함 예를 들어, 연락처 애플리케이션이 다른 애플리케이션에 연락처 데이터를 제공할 때 사용됨
- 역할: 데이터를 저장하고 관리하는 일종의 데이터베이스 역할을 하며, 다른 애플리케이션에 안전하게 데이터를 공유함
이 4대 컴포넌트를 이해하는 것은 안드로이드 애플리케이션의 기본적인 구조를 파악하는 데 매우 중요함 각 컴포넌트는 독립적인 기능을 가지면서도 서로 긴밀하게 연동되어, 복잡하고 다양한 기능의 애플리케이션을 만들 수 있는 기반을 제공
액티비티
액티비티(Activity)는 안드로이드 애플리케이션의 핵심 구성 요소로서 사용자가 직접 상호 작용하는 창(window)을 의미함 각 액티비티는 독립적인 화면으로서, 사용자에게 다양한 작업을 수행할 수 있는 인터페이스를 제공함
- 상호 작용의 예:
- 액티비티는 사용자가 전화를 거는 화면, 사진을 찍는 인터페이스, 이메일을 보내거나 지도를 확인하는 등의 다양한 기능을 수행할 때 마다 등장함
- UI 구성:
- 각 액티비티는 하나의 창을 가지며, 이 창에는 '뷰(View)'라 불리는 객체들을 통해 사용자 인터페이스가 구성됨 뷰 객체들은 버튼, 텍스트 필드, 이미지 등 사용자가 볼 수 있는 모든 요소들을 포함함
- 애플리케이션의 시작:
- 모든 안드로이드 애플리케이션은 최소 한 개 이상의 액티비티를 포함하고 있으며, 앱이 시작될 때 시스템은 지정된 '메인' 액티비티를 실행하여 사용자에게 첫 화면을 보여줌
액티비티는 사용자가 애플리케이션과 상호 작용하는 방식을 정의하는 중요한 요소이며, 안드로이드에서의 사용자 경험을 결정짓는 중추적인 역할을 담당함

액티비티란?
액티비티(Activity)는 안드로이드 애플리케이션의 핵심 구성 요소로서 사용자가 직접 상호 작용하는 창(window)을 의미함 각 액티비티는 독립적인 화면으로서, 사용자에게 다양한 작업을 수행할 수 있는 인터페이스를 제공함
- 상호 작용의 예:
- 액티비티는 사용자가 전화를 거는 화면, 사진을 찍는 인터페이스, 이메일을 보내거나 지도를 확인하는 등의 다양한 기능을 수행할 때 마다 등장함
- UI 구성:
- 각 액티비티는 하나의 창을 가지며, 이 창에는 '뷰(View)'라 불리는 객체들을 통해 사용자 인터페이스가 구성됨 뷰 객체들은 버튼, 텍스트 필드, 이미지 등 사용자가 볼 수 있는 모든 요소들을 포함함
- 애플리케이션의 시작:
- 모든 안드로이드 애플리케이션은 최소 한 개 이상의 액티비티를 포함하고 있으며, 앱이 시작될 때 시스템은 지정된 '메인' 액티비티를 실행하여 사용자에게 첫 화면을 보여줌
액티비티는 사용자가 애플리케이션과 상호 작용하는 방식을 정의하는 중요한 요소이며, 안드로이드에서의 사용자 경험을 결정짓는 중추적인 역할을 담당함
액티비티와 사용자 인터페이스 연결
- setContentView()를 이용하여 액티비티에 사용자 인터페이스를 정의한View를 설정


액티비티 등록
- 모든 Activity컴포넌트는 Android Manifest파일에 등록되어야 함

Android Manifest 역할
AndroidManifest.xml 파일은 안드로이드 애플리케이션의 심장부라 할 수 있음 이 파일은 애플리케이션의 기본 구조를 정의하고, 시스템이 앱을 어떻게 실행해야 하는지를 알려주는 중요한 지시사항을 담고 있음
- 패키지 이름 설정:
- 앱의 고유 식별자로서, 애플리케이션의 패키지 이름을 설정함 이 이름은 Google Play와 같은 앱 스토어에서 앱을 구별하는 데 사용됨
- 구성 요소 선언:
- 액티비티, 서비스, 브로드캐스트 리시버, 콘텐트 프로바이더와 같은 애플리케이션 구성요소들의 존재를 시스템에 알림
- 권한 설정:
- 앱이 사용자의 기기에서 특정 작업을 수행하기 위해 필요한 권한을 명시함 또한, 다른 앱이 이 애플리케이션과 상호작용하기 위해 필요한 권한도 설정할 수 있음
Intent
- 인텐트(Intent)는 일종의 메시지 객체임
- 이것을 사용해 다른 앱 구성요소(액티비티, 서비스, 브로드 캐스트리시버)로 작업을 요청 할수 있음

Intent의 유형
명시적 인텐트(Explicit Intent)
명시적 인텐트는 특정한 컴포넌트를 직접적으로 호출할 때 사용되는 인텐트임 이 방법으로, 개발자는 인텐트 객체에 시작하고자 하는 구성 요소의 이름을 명확하게 설정하고 startActivity() 또는 startService() 메소드를 통해 해당 컴포넌트를 실행시킴
- 활용 예시:
- 이 방식은 주로 앱 내부에서 다른 액티비티나 서비스를 시작할 때 사용됨 예를 들어, 메인 액티비티에서 사용자의 입력을 받아 세부 정보를 표시하는 새로운 액티비티를 띄울 때 명시적 인텐트가 활용됨
암시적 인텐트(Implicit Intent)
암시적 인텐트는 특정한 컴포넌트를 명시하지 않고, 수행하고자 하는 일반적인 작업을 인텐트 객체에 설정하여 startActivity() 메소드에 넘김 이 때, 안드로이드 시스템은 이 인텐트를 처리할 수 있는 모든 애플리케이션을 검색하여 적합한 인텐트 필터를 가진 컴포넌트를 찾아 실행시킴
- 인텐트 필터:
- 인텐트 필터는 특정 인텐트에 반응하는 액티비티, 서비스 또는 브로드캐스트 리시버의 능력을 정의함 즉, 어떤 인텐트를 수신할 준비가 되어 있는지를 나타내는 설정임
- 일반적 사용법:
- 암시적 인텐트는 주로 다른 앱의 컴포넌트를 실행시키는 데 사용됨 예를 들어, 사용자가 '지도 보기'를 요청할 때, 해당 작업을 처리할 수 있는 모든 앱 중 사용자가 선택할 수 있도록 안드로이드 시스템이 목록을 제공함

인텐트 객체
인텐트는 안드로이드 앱의 구성 요소들 사이에서 실행을 위임하거나 정보를 전달하는 역할을 함 다음은 인텐트의 주요 구성 요소와 그에 대한 실제 사용 예임
컴포넌트 이름 (Component Name)
- 타겟 컴포넌트의 이름을 명시하여, 인텐트가 전달될 정확한 대상을 지정함
- 예:
new Intent(context, TargetActivity.class)에서 TargetActivity.class가 컴포넌트 이름임
- 컴포넌트 이름이 없으면, 인텐트는 암시적으로 처리되고, 시스템이 적절한 대상을 찾음
액션 (Action)
- 인텐트가 수행해야 할 일반적인 작업을 정의함
- 예:
Intent.ACTION_VIEW는 사용자에게 데이터를 보여줄 때 사용됨
- 예:
Intent.ACTION_DIAL은 전화 다이얼을 열기 위해 사용됨
데이터 (Data)
- 작업을 수행하는 데 필요한 데이터의 URI를 지정함
- 예:
Uri.parse("tel:12345")는 전화 앱에 전화번호 데이터를 제공함
- 데이터는 보통
Uri 객체로 액션과 결합하여 사용됨
카테고리 (Category)
- 인텐트의 유형을 더 구체적으로 지정하여, 어떤 컴포넌트가 처리할 수 있는지 알려줌
- 예:
Intent.CATEGORY_HOME은 홈 화면 애플리케이션을 시작할 때 사용됨
엑스트라 (Extras)
- 복잡한 데이터를 인텐트에 전달하기 위한 키-값 쌍의 추가 정보임
- 예:
intent.putExtra("extra_key", "value")에서 "extra_key"는 전달할 데이터의 키이며, "value"는 실제 값임
- 엑스트라를 통해 기본 타입부터 Serializable 객체까지 다양한 데이터를 전달할 수 있음
명시적인텐트로 다른 액티비티 시작하기
명시적 인텐트(Explicit Intent)는 특정한 액티비티를 시작할 때 사용되며, 안드로이드에서는 이를 통해 현재 액티비티에서 다른 액티비티로 전환할 수 있음
val intent = Intent(this, AnotherActivity::class.java)
intent.putExtra("key", "value")
startActivity(intent)
- 인텐트 생성:
Intent 클래스의 인스턴스를 생성함 첫 번째 매개변수로는 현재 컨텍스트(this)를, 두 번째 매개변수로는 시작하고자 하는 액티비티의 Class 객체를 전달함 위 예제에서 AnotherActivity::class.java는 시작하고자 하는 대상 액티비티를 나타냄
- 데이터 전달 (선택 사항):
putExtra 메소드를 사용하여 인텐트에 추가 데이터를 삽입할 수 있음 이는 키-값 쌍으로 이루어져 있으며, 시작될 액티비티에서 이 데이터를 사용할 수 있음
- 액티비티 시작:
startActivity 메소드를 호출하여 인텐트를 사용함 이 호출이 실행되면 안드로이드 시스템은 명시된 인텐트에 따라 AnotherActivity를 시작함
이 방법을 통해 현재 액티비티에서 다른 액티비티로의 전환을 명확하게 제어할 수 있으며, 앱의 흐름을 관리하는 데 필수적인 기능임 명시적 인텐트는 주로 앱 내부의 액티비티 전환에 사용되며, 암시적 인텐트와 달리 시스템이 액티비티를 추론할 필요 없이 개발자가 직접 지정함
암시적 인텐트로 다른 액티비티 시작하기

암시적 인텐트 수신(인텐트 필터)

액티비티 간의 데이터 전달
데이터 전달은 어떻게 될까?
- 인텐트에 컴포넌트 실행을 요청할 때 데이터를 함께 전달하려면 엑스트라 데이터를 이용
- 엑스트라 데이터는 인텐트에 담는 부가 정보라 할 수 있음
- Extras를 활용하여 이름과 값의 쌍으로된 정보를 전달


액티비티 생명주기

액티비티의 수명
- onCreate()호출과 onDestroy()호출 사이에 있음
onCreate()
onDestroy()
- 호출되는 시점에 사용하고 있는 리소스를 모두 해제하고 생을 마감함
액티비티의 화면이 눈에 보이게 되는 Visibility
- onStart()에서 onStop()호출 사이에 있음
- 이 기간 중에는 사용자가 액티비티를 화면에서 보고 이와 상호 작용 할 수 있음
- onStop()이 호출되어 새 액티비티가 시작되면 이 액티비티는 더 이상 표시되지 않게 됨
- 시스템은 액티비티의 전체 수명 내내 onStart() 및 onStop()을 여러 번 호출 할 수 있음
- 이때 액티비티는 사용자에게 표시되었다 숨겨지는 상태를 오가게 됨
액티비티가 foreground에서 동작하는 구간
- onResume()에서 onPause()호출 사이를 말함
- 이 기간 중에는 이 액티비티가 화면에서 다른 모든 액티비티 앞에 표시됨
- 사용자 입력도 여기에 집중됨
- 액티비티는 전경에 나타났다 숨겨지는 전환을 자주 반복할 수 있음
- 예를 들어, 기기가 절전모드에 들어가거나 대화상자가 나타나면 onPause()가 호출됨
5) 수명주기 콜백 메소드
- 액티비티가 생성되면서 해제될 때 까지 액티비티의 상태에 따라서 불려지는 메소드를 라이프 사이클 콜백 메소드라 부름
- 애플리케이션 개발자는 필요한 경우에 해당 콜백 메소드를 재 정의하여 필요한 일을 수행하게 할 수 있음
- 주요 콜백 메소드

액티비티 전환 시 수명주기 콜백 메소드 호출 순서
FirstActivity에서 SecondActivity 시작

단말기의 뒤로가기 버튼 누름
