개요
컴포넌트(Component)란 안드로이드 애플리케이션을 생성할 수 있도록 제공되는 구성 요소(building block)이다. 각각의 컴포넌트는 다른 진입점을 통하여 애플리케이션에 들어간다. 안드로이드 애플리케이션은 4개의 핵심 컴포넌트를 가지고 있으며 각 컴포넌트의 객체를 생성하고 제거하는 라이프사이클의 구조도 각각 다르다.
1. 액티비티(Activity)
1.1. 액티비티의 개요
액티비티
는 사용자에게 보여지는 단일 화면으로, android.app.Activity 클래스를 상속받아 생성하며 사용자와 상호 작용하는 UI를 제공한다.
액티비티
는 시스템으로부터 애플리케이션이 시작되는 진입점 역할을 수행하며 안드로이드 애플리케이션은 1개 이상의 액티비티
로 구성되어 있다. 액티비티
는 화면에 표시하는 역할만 수행하며 내용은 뷰(View)가 갖는다.
Android-Manifest.xml 파일의 <activity> 태그는 액티비티
에 대한 정보를 포함하고 있으며,
새로운 액티비티
를 만들 경우 이 매니페스트 파일에 새 액티비티
정보를 추가해야 한다. 또한, 액티비티
는 액티비티 매니저(ActivityManager) 라는 객체에 의해 액티비티 스택(Activity Stack) 에서 관리된다.
1.2 액티비티의 수명주기(Activity Lifecycle)
액티비티는 기본적으로 3가지 상태를 가지고 있다.
-
- 활성화(active), 실행(running) 상태
- 액티비티는 사용자의 동작에 의해 포커스를 받아 화면 상에서 포그라운드(foreground)에 있을 때(액티비티 스택의 가장 위에 있는 상태), 활성화 또는 실행 상태가 된다.
-
- 일시중단(paused) 상태
- 사용자에게는 아직 보이지만 포커스를 잃었을 때, 액티비티는 일시중단 상태가 된다. 일시 중단된 액티비티는 아직 살아 있으나, 메모리가 부족한 경우 시스템에 의해 죽여질 수 있다.
-
- 중지(stopped) 상태
- 다른 액티비티에 의해 완전히 보이지 않는 상태가 되었을 때, 액티비티는 중지 상태가 된다. 모든 상태들과 정보는 유지하고 있으나 메모리가 필요한 경우 시스템에 의해 죽여질 수 있다. 일시중단 혹은 중지된 액티비티는 재시작(restart)할 수 있다.
액티비티의 수명주기는 애플리케이션의 상태에 맞추어 어떤 기능을 동작시키는 코드를 넣을 수 있도록 해 준다. 수명주기는 화면의 상태에 따라 달라지는데 각각의 상태에 따라 자동으로 호출되는 메소드가 다르다.
메소드 | 설명 | 다음에 실행될 수 있는 메소드 |
---|---|---|
void onCreate(Bundle savedInstanceState) |
액티비티가 처음 생성되었을 때 호출되며, 항상 다음에는 onStart() 메소드가 호출된다. | onStart() |
void onStart() |
액티비티가 사용자에게 보이기 전에 호출되는 메소드이다. |
onResume() onStop()
|
void onRestart() |
중단된 액티비티가 다시 시작될 때 호출되며, 항상 다음에는 onStart() 메소드가 호출된다. |
onStart() |
void onResume() |
액티비티가 사용자와 상호작용 하기 전 호출되며, 이 때 액티비티 스택의 가장 상단에 위치한다. 일시중지된 액티비티가 다시 시작될 때 호출되므로 onPause() 다음에 수행된다. |
onPause() |
void onPause() |
시스템이 다른 액티비티를 실행시킬 때 호출된다. 세션을 유지하는 애플리케이션의 경우, 여기서 프레퍼런스의 값을 할당/변경한다. |
onResume() onStop()
|
void onStop() |
사용자에 의해 액티비티가 더이상 보이지 않게 될 때 호출된다. |
onRestart() onDestroy()
|
void onDestroy() |
액티비티가 제거되기 직전에 호출되며 액티비티가 받는 마지막 호출이다. finish() 메소드가 호출되거나 메모리가 부족한 경우 호출된다. |
X |
접근 제어자는 모두
protected
이다.
간단한 애플리케이션의 경우 onCreate 메소드만을 오버라이딩하여 사용한다.
1.3 인텐트(Intent)
액티비티, 서비스, 브로드캐스트 리시버는 인텐트
라는 비동기 메시지에 의해 활성화된다. 인텐트
의 주요 기능은 컴포넌트 실행 이며, 같은 애플리케이션 내에서도 다른 액티비티로 화면을 교체할 때에는 인텐트
가 필요하다.인텐트
는 android.content.Intent 클래스의 객체를 생성해서 사용한다.
-
명시적 인텐트(Explicit Intent) : 사용자가 정의한 액티비티 호출
Intent intent = new Intent(this, YourActivity.class);
-
암묵적 인텐트(Implicit Intent) : 내장된 액티비티 호출
Intent intent = new Intent("android.intent.android.View", Url.parse("http://www.google.com/"));
추가로 액티비티를 위한 인텐트 플래그도 존재한다.
2. 서비스(Service)
2.1. 서비스의 개요
서비스
는 android.app.Service 클래스를 상속받아 생성하며, 백그라운드에서 실행되는 앱의 구성 요소 이다. 백그라운드에서 음악을 재생하거나 네트워크에서 파일을 다운로드하는 작업 등 액티비티에서 처리하기 어려운 작업 등을 실행한다. 따라서 실행된 상태를 계속 유지하기 위해 서비스
가 비정상적으로 종료되도 자동으로 재실행한다. 서비스
는 액티비티와 마찬가지로 새로 만들 경우 매니페스트 파일에 새 서비스
정보를 추가해야 한다.
2.2. 서비스의 수명주기(Service Lifycycle)
메소드 | 설명 |
---|---|
void onCreate() |
서비스 생성 |
void onStart(Intent intent) |
서비스 시작 |
void onDestroy() |
서비스 제거 |
접근 제어자는 모두
public
이다.
3. 브로드캐스트 리시버(Broadcasr Receiver)
브로드캐스트 리시버
는 android.content.BroadcastReceiver 클래스를 상속받아 생성하며, 오직 수신만 하는 컴포넌트 이다. 브로드캐스트 리시버
는 UI에 표시하지 않고, 브로드캐스트 이벤트 발생 시 상태바(status bar)에 알림(notification)을 표시한다.
브로드캐스트 리시버
는 단 하나의 콜백 메소드만을 갖는다.
메소드 | 설명 |
---|---|
void onReceive(Context, Intent) |
메시지가 리시버로 도착하면 자동으로 실행되어 시지를 Intent 객체와 연결된 객체로 전달한다. |
4. 콘텐트 프로바이더(Content Provider)
콘텐트 프로바이더
는 android.content.ContentProvider 클래스를 상속받아 생성하며 애플리케이션 데이터의 공유를 관리 한다. 안드로이드 애플리케이션에서 파일, SQLite 데이터베이스 혹은 웹 상에 저장된 데이터들은 콘텐트 프로바이더
를 통해 공유될 수 있다.
REFERENCE
Do it! 안드로이드 앱 프로그래밍 (개정 6판), 정재곤, 이지스퍼블리싱
안드로이드 with Kotlin 앱 프로그래밍 가이드, 안귀정, 아이콕스
은노기의 안드로이드 프로그래밍, 김은옥, 삼양미디어
[네이버 부스트코스] 안드로이드 프로그래밍