[Android] 안드로이드 기초 - 안드로이드 4대 컴포넌트 : 액티비티, 서비스, 콘텐츠 프로바이더, 브로드캐스트 리시버



개요

컴포넌트(Component)란 안드로이드 애플리케이션을 생성할 수 있도록 제공되는 구성 요소(building block)이다. 각각의 컴포넌트는 다른 진입점을 통하여 애플리케이션에 들어간다. 안드로이드 애플리케이션은 4개의 핵심 컴포넌트를 가지고 있으며 각 컴포넌트의 객체를 생성하고 제거하는 라이프사이클의 구조도 각각 다르다.


1. 액티비티(Activity)

1.1. 액티비티의 개요

액티비티는 사용자에게 보여지는 단일 화면으로, android.app.Activity 클래스를 상속받아 생성하며 사용자와 상호 작용하는 UI를 제공한다.
액티비티는 시스템으로부터 애플리케이션이 시작되는 진입점 역할을 수행하며 안드로이드 애플리케이션은 1개 이상의 액티비티로 구성되어 있다. 액티비티는 화면에 표시하는 역할만 수행하며 내용은 뷰(View)가 갖는다.
Android-Manifest.xml 파일의 <activity> 태그는 액티비티에 대한 정보를 포함하고 있으며, 새로운 액티비티를 만들 경우 이 매니페스트 파일에 새 액티비티 정보를 추가해야 한다. 또한, 액티비티액티비티 매니저(ActivityManager) 라는 객체에 의해 액티비티 스택(Activity Stack) 에서 관리된다.

<그림 1> 액티비티의 역할


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

:bulb: 접근 제어자는 모두 protected이다.
간단한 애플리케이션의 경우 onCreate 메소드만을 오버라이딩하여 사용한다.


<그림 2> 액티비티 라이프사이클 구조도


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/"));
    

:bulb: 추가로 액티비티를 위한 인텐트 플래그도 존재한다.


2. 서비스(Service)

2.1. 서비스의 개요

서비스android.app.Service 클래스를 상속받아 생성하며, 백그라운드에서 실행되는 앱의 구성 요소 이다. 백그라운드에서 음악을 재생하거나 네트워크에서 파일을 다운로드하는 작업 등 액티비티에서 처리하기 어려운 작업 등을 실행한다. 따라서 실행된 상태를 계속 유지하기 위해 서비스가 비정상적으로 종료되도 자동으로 재실행한다. 서비스는 액티비티와 마찬가지로 새로 만들 경우 매니페스트 파일에 새 서비스 정보를 추가해야 한다.

<그림 3>서비스의 역할


2.2. 서비스의 수명주기(Service Lifycycle)

메소드 설명
void onCreate() 서비스 생성
void onStart(Intent intent) 서비스 시작
void onDestroy() 서비스 제거

:bulb: 접근 제어자는 모두 public이다.

<그림 4>서비스 라이프사이클 구조도


3. 브로드캐스트 리시버(Broadcasr Receiver)

브로드캐스트 리시버android.content.BroadcastReceiver 클래스를 상속받아 생성하며, 오직 수신만 하는 컴포넌트 이다. 브로드캐스트 리시버는 UI에 표시하지 않고, 브로드캐스트 이벤트 발생 시 상태바(status bar)에 알림(notification)을 표시한다.

브로드캐스트 리시버는 단 하나의 콜백 메소드만을 갖는다.

메소드 설명
void onReceive(Context, Intent) 메시지가 리시버로 도착하면 자동으로 실행되어 시지를 Intent 객체와 연결된 객체로 전달한다.

4. 콘텐트 프로바이더(Content Provider)

콘텐트 프로바이더android.content.ContentProvider 클래스를 상속받아 생성하며 애플리케이션 데이터의 공유를 관리 한다. 안드로이드 애플리케이션에서 파일, SQLite 데이터베이스 혹은 웹 상에 저장된 데이터들은 콘텐트 프로바이더를 통해 공유될 수 있다.



:bookmark: REFERENCE
Do it! 안드로이드 앱 프로그래밍 (개정 6판), 정재곤, 이지스퍼블리싱
안드로이드 with Kotlin 앱 프로그래밍 가이드, 안귀정, 아이콕스
은노기의 안드로이드 프로그래밍, 김은옥, 삼양미디어
[네이버 부스트코스] 안드로이드 프로그래밍