728x90
안드로이드의 4대 컴포넌트
안드로이드 애플리케이션은 주로 네 가지 주요 컴포넌트로 구성된다
이들은 애플리케이션의 구조를 정의하고, 안드로이드 시스템과 어떻게 상호 작용하는지를 결정한다
- 액티비티(Activity)
- 액티비티는 사용자가 직접 상호작용하는 화면을 말한다.
예) 이메일 앱에서 이메일 목록을 보여주는 화면, 이메일 작성 화면 등이 각각 독립된 액티비티이다
- 사용자 인터페이스(UI)를 담당하며, 사용자의 입력에 반응하는 이벤트 기반 프로그래밍을 가능하게 한다 - 서비스(Service)
- 서비스는 백그라운드에서 오랜 시간 동안 실행 되어야 하는 작업을 수행한다
예) 음악재생, 파일 다운로드 등
- 사용자가 직접적으로 인지하지 못하는, 애플리케이션의 '백스테이지'에서 일어나는 작업 - 브로드캐스트 리시버(Broadcast Receiver)
- 브로드캐스트 리시버는 안드로이드 시스템으로부터 발송되는 다양한 이벤트나 정보를 애플리케이션이 받을 수 있게 해주는 컴포넌트이다.
예) 배터리 부족 경고, 화면 꺼짐 등의 시스템 이벤트를 처리할 때 사용된다
- 애플리케이션은 브로드캐스트 메시지를 구독하고, 해당 이벤트가 발생했을 때 반응할 수 있다 - 콘텐츠 프로바이더(Content Provider)
- 콘텐트 프로바이더는 애플리케이션 간의 데이터 공유를 가능하게 한다.
예) 연락처 애플리케이션이 다른 애플리케이션에 연락처 데이터를 제공할 때 사용된다
- 데이터를 저장하고 관리하는 일종의 데이터베이스 역할을 하며, 다른 애플리케이션에 안전하게 데이터를 공유한다
1. 액티비티(Activity)
위에서 말했듯, 상호 작용하는 창을 의미한다.
각 액티비티는 하나의 창을 가지며, 이 창에서 '뷰(View)'라고 불리는 객체들을 통해 사용자 인터페이스를 구성한다
- 모든 Activity 컴포넌트는 Android Manifest 파일에 등록되어야 한다
- AndroidManifest.xml란? 애플리케이션의 기본 구조를 정의하고, 시스템이 앱을 어떻게 실행해야 하는지를 알려주는 중요한 지시사항을 담고 있다
2. 인텐트(Intent)
인텐트는 일종의 메시지 객체이며, 인텐트를 사용해 다른 앱 구성요소(액티비티, 서비스, 브로드 캐스트리시버)로 작업을 요청할 수 있다
2-1 명시적 인텐트(Explicit Intent)
특정한 컴포넌트를 직접적으로 호출할 때 사용되는 인텐트이다
- 개발자가 인텐트 객체에 시작하고자 하는 구성 요소의 이름을 명확하게 설정하고 startActivity() 또는 startService() 메서드를 통해 해당 컴포넌트를 실행시킨다
- 주로 앱 내부에서 다른 액티비티나 서비스를 시작할 때 사용된다
예) 메인 액티비티에서 사용자의 입력을 받아 세부 정보를 표시하는 새로운 액티비티를 띄울 때
2-2 암시적 인텐트(Implicit Intent)
특정한 컴포넌트를 명시하지 않고, 수행하고자 하는 일반적인 작업을 인텐트 객체에 설정하여 startActivity() 메서드에 넘김
이때, 안드로이드 시스템은 이 인텐트를 처리할 수 있는 모든 애플리케이션을 검색하여 적합한 인텐트 필터를 가진 컴포넌트를 찾아 실행시킨다
( = 인텐트는 안드로이드 앱의 구성 요소들 사이에서 실행을 위임하거나 정보를 전달하는 역할을 한다 )
- 인텐트 필터
특정 인텐트에 반응하는 액티비티, 서비스 또는 브로드캐스트 리시버의 능력을 정의한다.
(= 어떤 인텐트를 수신할 준비가 되어 있는지를 나타내는 설정) - 일반적인 사용
암시적 인텐트는 주로 다른 앱의 컴포넌트를 실행시키는 데 사용된다
예) 사용자가 '지도 보기'를 요청할 때, 해당 작업을 처리할 수 있는 모든 앱 중 사용자가 선택할 수 있도록 안드로이드 시스템이 목록을 제공한다
2-3. 인텐트의 주요 구성요소
- 컴포넌트 이름(Component Name)
- 타겟 컴포넌트의 이름을 명시하여, 인텐트가 전달될 정확한 대상을 지정한다
예) new Intent(context, TargetActivity.class)에서 TargetActivity가 컴포넌트의 이름이다
- 컴포넌트의 이름이 없으면, 인텐트는 암시적으로 처리되고 시스템이 적절한 대상을 찾는다 - 액션(Action)
- 인텐트가 수행해야 할 일반적인 작업을 정의한다
예1) Intent.ACTION_VIEW는 사용자에게 데이터를 보여줄 때 사용
예2) Intent.ACTION_DIAL은 전화 다이얼을 열기 위해 사용 - 데이터(Data)
- 작업을 수행하는 데 필요한 데이터의 URI를 지정한다
예) Uri.parse("tel:12345")는 전화 앱에 전화번호 데이터를 제공
- 데이터는 보통 Uri 객체로 액션과 결합하여 사용된다 - 카테고리(Category)
- 인텐트의 유형을 더 구체적으로 지정하여, 어떤 컴포넌트가 처리할 수 있는지 알려준다
예) Intent.CATEGORY_HOME은 홈 화면 애플리케이션을 시작할 때 사용된다 - 엑스트라(Extras)
- 복잡한 데이터를 인텐트에 전달하기 위한 키-값 쌍의 추가 정보
예) intent.putExtra("extra_key", "value")에서 extra_key는 전달할 데이터의 키이며, value는 실제 값
- 엑스트라를 통해 기본 타입부터 Serializable 객체까지 다양한 데이터를 전달할 수 있다
2-4. 액티비티 간의 데이터 전달
Extras를 활용하여 이름과 값의 쌍으로 된 정보를 전달해 줄 수 있다
- Extras에 값을 저장하는 메서드
- intent.putExtra(String name, int value)
- intent.putExtra(String name, String value)
- intent.putExtra(String name, boolean value) - Extras에 저장된 값을 읽는 메서드
- int : getIntExtra(String name, int defaultValue)
- String : getStringExtra(String name)
- boolean : getBooleanExtra(String name, boolean defaultValue)
2-5. 액티비티와 인텐트를 활용해 보기
- TextView - "첫번째 액티비티 입니다"
- Button - "두번째 액티비티 시작하기", "다이얼 작업 시작하기", "지도보기 작업 시작하기", "세번째 액티비티에 데이터 전달"
- EditText - hint = "데이터 입력" / "yyg864(에뮬레이터에서 입력함)"
activity_first.xml의 뷰(View)들에 각각의 코드 입력
- TextView - "두번째 액티비티 입니다"
- Button - "닫기" 눌렀을 때 finish()
- TextView - "세번째 액티비티 입니다"
- EditText - "yyg864" = 첫 번째 액티비티에서 전달받은 strData값(=yyg864)
- Button - "닫기" 눌렀을 때 finish()
3. 액티비티 생명주기
- 액티비티의 수명
- onCreate() 호출과 onDestroy() 호출 사이에 있다
- onCreate()란? 액티비티가 생성되어 레이아웃 설정등을 수행하는 메서드
- onDestroy()란? 호출되는 시점에 사용되고 있는 리소스를 모두 해제하고 종료되는 메서드 - 액티비티의 화면이 눈에 보이게 되는 Visibility
- onStart()에서 onStop() 호출 사이에 있음
- 이 기간 중에는 사용자가 액티비티를 화면에서 보고 이와 상호작용 할 수 있다
- onStop()이 호출되어 새 액티비티가 시작되면 이 액티비티는 더 이상 표시되지 않는다
- 시스템은 액티비티의 전체 수명 내내 onStart() 및 onStop()을 여러 번 호출할 수 있다
- 이때, 액티비티는 사용자에게 표시되었다가 숨겨지는 상태를 오간다 - 액티비티가 foreground에서 동작하는 구간
- onResume()에서 onPause() 호출 사이를 말한다
- 이 기간 중에는 이 액티비티가 화면에서 다른 모든 액티비티 앞에 표시된다
- 사용자 입력도 여기에 집중된다
- 액티비티는 전경에 나타났다 숨겨지는 전환을 반복할 수 있다
예) 기기가 절전모드에 들어가거나, 대화상자가 나타나면 onPause() 호출 - 수명주기 콜백 메서드
- 액티비티가 생성되면서 해제될 때까지 액티비티의 상태에 따라서 불려지는 메서드 (= 라이프 사이클 콜백 메서드)
- 애플리케이션 개발자는 필요한 경우에 해당 콜백 메서드를 재정의하여 필요한 일을 수행하게 할 수 있다
- onCreate()
- Activity가 시작될 때 불리는 메서드, 생명주기동안 최초실행 시 딱 한 번만 실행된다
예) 화면 레이아웃 정의, 뷰(View) 생성 - onStart()
- Activity가 보이기 전에 호출되는 메서드, 화면에 진입할 때마다 실행되어야 하는 코드가 있다면 onStart()에 작성 - onResume()
- Activity의 일부가 보일 때 호출, 잠시 액티비티가 일시정지 되었다가 돌아오는 경우에 호출된다
- 일부가 보일 때부터, 전체가 보일 때까지의 시간만큼만 수행되기 때문에 가벼운 작업만 수행해야 한다 - onPause()
- 방해되는 이벤트가 발생하고 Activity의 일부는 보이지만 다른 Activity가 foreground로 나올 때 호출된다
- onPause()는 아주 잠깐 실행되는 메서드이다
- 그래서 메서드가 완료되기 전에 작업이 끝나지 않을 수 있다
- 때문에 데이터를 저장하거나, 네트워크를 호출하는 등 무거운 작업을 하면 안 된다 - onStop()
- Activity가 사용자에게 더 이상 보이지 않을 때 호출, onPause()에서 경고한 무거운 작업을 onStop()에서 처리하자
예) 애플리케이션을 통해 영상을 보다가 다른 작업 때문에 백그라운드로 이동시켰을 때 onStop()을 활용해서 영상을 멈추도록 하기 or 노래 재생 - onRestart()
- 사용 중인 앱에서 홈으로 나갔다가 다시 돌아오거나 다른 Activity로 갔다가 뒤로 가기 버튼을 통해 돌아오는 경우 호출 - onDestroy()
- 활동이 종료되는 경우나 구성변경(기기회전 등)으로 인해 시스템이 일시적으로 활동을 소멸시키는 경우에 호출
예) onDetsroy()에 메모리를 해제하도록 하기
- FirstActivity에서 SecondActivity 시작 과정
1. FirstActivity의 onPause()
2. SecondActivity의 onCreate() → onStart() → onResume()
3. FirstActivity의 onStop()
- 단말기의 뒤로 가기 버튼 눌렀을 경우(SecondActivity → FirstActivity)
1. SecondActivity의 onPause()
2. FirstActivity의 onRestart() → onStart() → onResume()
3. SecondActivity의 onStop() → onDestroy()
728x90
'코틀린(Kotlin) > TIL' 카테고리의 다른 글
[코틀린(Kotlin)] 기초문법 while문과 if문 연습 (0) | 2023.12.19 |
---|---|
[코틀린(Kotlin)] 기초문법 조건문/반복문 연습 (0) | 2023.12.18 |
[코틀린(Kotlin)] 안드로이드 UI 레이아웃(Layout (0) | 2023.12.13 |
[코틀린(Kotlin)] 안드로이드 UI 위젯(Widget (0) | 2023.12.12 |
[코틀린(Kotlin)] Intent, findViewById (0) | 2023.12.11 |