이번에는 안드로이드의 4대 컴포넌트에 대해서 배워보았습니다.

안드로이드의 4대 컴포넌트

안드로이드의 앱은 컴포넌트(Component)로 구성되어 있으며 Activity, Service, Broadcast Receiver, Content Provider가 있다. 각 컴포넌트들은 하나의 독립된 형태로 존재하며, 정해진 역할을 수행한다. 그러면 이 컴포넌트들 간의 상호 통신은 어떻게 하는지 생각해볼 필요가 있다.

그것은 바로 Intent라는 일종의 메시지 객체를 사용하여 상호 통신을 진행한다.

Activity(액티비티)

액티비티는 사용자 인터페이스 화면을 가지며 특정한 작업을 담당하는 컴포넌트

  • 일반적으로 UI를 갖는 하나의 스크린을 나타냅니다.
  • 안드로이드 애플리케이션은 반드시하나의 activity를 가지고 있어야 합니다.
  • 각 액티비티는 매니페스트 파일에 등록되어 있어야 합니다.
  • 하나 이상의 View를 가질 수 있습니다.

Service(서비스)

서비스는 백그라운드에서 실행되는 컴포넌트로 오랫동안 실행되는 작업이나 원격 프로세스를 위한 작업을 할 때 사용됩니다.

  • UI가 없습니다.
  • 한번 시작된 Service는 애플리케이션이 종료되고 다른 애플리케이션으로 이동해도 계속 백그라운드에서 실행됩니다.
  • 모든 서비스는 Service 클래스를 상속받아서 작성됩니다.
  • 네트워크를 통하여 데이터를 꺼내 올 수도 있습니다.
  • ex) 배경음악이나 안드로이드 사용량 모니터링, 주기적으로 특정 웹사이트에서 데이터를 읽어오는 것 등등

Broadcast Receiver(방송 수신자)

방송 수신자는 안드로이드 단말기에서 발생하는 다양한 이벤트/정보를 받고 반응하는 컴포넌트입니다.

  • 단말기에서 발생하는 일 중에서 애플리케이션이 알아야 하는 상황이 발생하면 방송을 해줍니다.
  • 수신기를 통해 상황을 감지하고 적절한 작업을 수행합니다.
  • 일반적으로 UI가 없습니다.
  • ex) 시스템 부팅, 배터리 부족, 전화/문자 수신, 네트워크 끊김을 알려주는 것 등등

Content Provider(콘텐트 제공자)

데이터를 관리하고 다른 애플리케이션 데이터를 제공하는 컴포넌트입니다.

  • 데이터는 파일 시스템이나 SQLite 데이터베이스, 웹 상에 저장될 수 있습니다.
  • 콘텐트 제공자를 통해서 다른 애플리케이션의 데이터를 쿼리하거나 변경 가능합니다.

Intent(인텐트)

인텐트는 서로 독립적으로 동작하는 4가지 컴포넌트들의 상호 통신을 위한 장치입니다.

  • 4대 컴포넌트의 통신 수단
  • 인텐트를 통하여 다른 애플리케이션의 컴포넌트를 활성화 시킬 수 있습니다.

Activity의 생명주기

onCreate()

  • 액티비티가 만들어지고 나서 최초에 실행될 때 호출됩니다.[한번만 호출됨.]
  • 액티비티에 필요한 리소스들을 초기화하거나 화면에 보이는 View들의 일반적인 상태들을 여기서 설정합니다.
  • 이전 상태가 저장되어 있을 경우, 번들 객체를 참조하여 이전 상태로 복원이 가능합니다.
  • 이 다음에는 항상 onStart()가 호출됩니다.

onStart()

  • 액티비티가 화면에 보이기 바로 전에 호출됩니다.
  • 액티비티가 화면상에 보이면 이 메소드 다음에 onResume()메소드가 호출된 것입니다.
  • 매우 빠르게 끝나고, onResume() 단계로 넘어갑니다.
  • 보통 Broadcast Receiver는 이 단계에서 등록하는 것이 좋습니다.
  • 액티비티가 시작되기 전에 호출되는 함수 / 액티비티가 멈춘 후 다시 시작되기 전에 호출되는 함수

onResume()

  • 액티비티가 사용자와 상호 작용하기 바로 직전에 호출되는 함수입니다. 이 메소드가 호출되고 나서 바로 액티비티가 사용자에게 보이기 시작합니다.
  • 액티비티가 화면에 보여집니다.
  • 사용자에게 focus를 잡은 상태입니다.

onRestart()

  • 액티비티가 중지된(Stopped) 이후에 호출되는 메소드로 다시 시작되기 바로 전에 호출됩니다.
  • 액티비티가 멈춰 있다가 다시 다시 호출될 때 불리는 함수입니다.

다른 액티비티가 호출되는 경우

onPause()

  • 액티비티 위에 액티비티가 올라와서 focus를 잃었을 때 호출되는 함수
  • 액티비티가 완전히 가려지지 않고 부분만 가려진 상태에서 호출되는 함수, 즉 일부분이 보이거나 투명상태일 경우에 호출됩니다.
  • 다른 액티비티가 호출되기 전에 실행되기 때문에 onPause() 함수에서 시간이 많이 소요되는 작업이나 많은 일을 처리하면 다른 액티비티가 호출되는 시간이 지연되기 때문에 많은 일을 처리하지 않도록 주의합니다.
    [ex) A 액티비티에서 B 액티비티를 호출하는 경우, A 액티비티의 onPause() 함수가 먼저 호출되고 나서 B 액티비티가 실행되는 흐름이다.]
  • 영구적인 Data는 여기서 저장합니다.
  • 이 메소드가 리턴하기 전에는 다음 액티비티가 시작될 수 없으므로 이 작업은 빠르게 리턴되어야 합니다.
  • 액티비티가 이 상태에 들어가면 시스템은 액티비티를 강제 종료할 수 있습니다.

onStop()

  • 액티비티 위에 다른 액티비티가 완전히 올라와 100% 가려질 때 호출되는 함수
  • 액티비티가 사용자에게 더 이상 보이지 않을 때 호출되는 함수
  • 만약 이 상태에서 액티비티가 다시 불려지면 onRestart()함수가 호출됩니다.
  • 시스템이 onStop() 상태에 들어오면, onSaveInstanceState()이라는 메소드를 호출하는데, 이 단계에서는 key-value 형태로 값을 저장할 수 있고, 이 값을 onCreate()에서 복원할 수 있습니다.
  • ex) 홈 키를 누른 경우, 또는 다른 액티비티 페이지로 이동이 있는 경우에 호출됩니다.

onDestroy()

  • 액티비티가 완전히 스택에서 없어질 때 호출되는 함수
  • 제거되는 경우입니다.
  • Finish() 메소드가 호출되거나 시스템 메모리 확보를 위해서 시스템이 강제로 종료시키는 경우에 호출될 수 있습니다.

참고 사항

  • onStop(), onDestroy() 함수는 호출되지 않을 수도 있습니다.
  • 메모리 부족으로 인해 onStop()이 호출되지 않을 수 있습니다.

Q & A

Q. 앱을 사용하는 도중에 카카오톡 메시지가 온다면 사용하던 앱의 TopActivity의 생명주기는 어떤 상태가 되나?

A. onPause()

Q. 데이터를 불러오는 작업은 어디서 해야 하나?

A. onCreate()

Q. 다른 액티비티가 상단에 올라오면 어떤 상태인가?

A. 실행 중이던 액티비티는 onPause() -> onStop()

Q. onRestart()는 언제 호출되는가?

A. 다른 액티비티 밑에 깔려 있어서 onStop() 상태에 있다가 다시 돌아오면 호출된다.

Q. 화면이 회전하면 액티비티 생명주기는?

A. onPause() -> onStop() -> onCreate() -> onStart() -> onResume()
현재 액티비티를 destroy하고 새로 생성하기 때문에 기존 데이터를 유지하기 위해서는 onSaveInstanceState()에서 Bundle에 데이터를 저장하도록 오버라이드 해야 한다.

Q. A 액티비티에서 B 액티비티를 실행할 경우 생명주기는?

A. A.onPause() -> B.onCreate() -> B.onStart() -> B.onResume() -> A.onStop() : B는 사용자에게 보여짐.