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

Activity(액티비티)

사용자 인터페이스 화면을 가지며 특정한 작업을 담당하는 컴포넌트
UI를 구성하는 컴포넌트
안드로이드의 Manifest 파일에 등록이 되어 있어야 한다.
안드로이드 Application은 최소 1개 이상의 Activity가 있어야 한다.
하나 이상의 View를 가질 수 있다.
쉽게 말하자면 사용자가 보는 화면이다.

Service(서비스)

백그라운드에서 실행되는 컴포넌트로 오랫동안 실행되는 작업이나 원격 프로세스를 위한 작업을 할 때 사용된다.
모든 서비스는 Service 클래스를 상속 받는다.
한 번 실행되면 다른 어플리케이션으로 이동하더라도 종료되지 않는다.
네트워크를 통하여 데이터를 꺼내올 수도 있다.
ex) 뮤직 플레이어, 안드로이드 사용량 모니터링, 주기적으로 특정 웹사이트에서 데이터를 읽어오는 것 등등

BroadCast Receiver

BroadCast는 시스템에서 발생하는 이벤트이며 이것의 Receiver은 특정 BroadCast에 반응하는 컴포넌트
단말기에서 발생하는 다양한 이벤트 / 정보를 받고 반응한다.
수신기를 통해 상황을 감지하고 적절한 작업을 수행한다.
신호만 기다릴 뿐 별도의 UI를 거치지 않는다.
ex) 배터리 부족, 네트워크 전송, 시스템 부팅, 전화/문자 수신, 네트워크 끊김을 알려주는 것 등등

Content Provider

데이터를 관리하고 어플리케이션 간 데이터 공유를 위한 컴포넌트
데이터는 파일 시스템이나 SQLite 데이터베이스, 웹 상에 저장될 수 있습니다.
콘텐트 제공자를 통해서 다른 애플리케이션의 데이터를 쿼리하거나 변경 가능합니다.
유일한 합법적 데이터 공유 장치
(주소록 Content Provider를 통해 제공)

Activity의 생명주기

onCreate()

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

onStart()

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

onResume()

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

onRestart()

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

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

onPause()

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

onStop()

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

onDestroy()

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

참고

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

Fragment(프래그먼트)

일종의 하위 Activity이며 자체 생명주기를 갖는다.
자체 입력 이벤트를 가지고 있으며 값 전달은 Bundle로 한다.
[Activity가 Intent로 한 것과는 대조적이다.]
Tag를 달 수 있다.
FragmentManager를 통해 관리할 수 있다.

FragmentManager

Fragment 관리를 목적으로 하는 클래스
FragmentManager 클래스를 통해 FragmentTransaction 객체를 FragmentTransaction을 통해 동적 관리
Kotlin에서는 supportFragmentManager를 통해 생성

FragmentTransaction

Fragment 추가, 삭제, 전환을 도와주는 클래스
addToBackStack() 함수를 호출해서 교체되서 Fragment를 back stack에 저장
항상 마지막에 변경사항 적용을 위해 commit()을 해야 한다.

onAttach() :

  • 프래그먼트가 액티비티에 붙을 때 호출된다.
  • 하지만, 아직 완벽하게 생성된 것은 아니다.
  • 프래그먼트는 액티비티 없이는 단독적으로 존재할 수 없기 때문이다.

onCreate() :

  • 본격적으로 프래그먼트가 액티비티의 호출을 받아 생성되는 시점이다.
  • 액티비티의 onCreate()에서는 view나 UI 작업을 할 수 있으나, 프래그먼트의 onCreate()에서는 할 수 없다.

onCreateView() :

  • 프래그먼트에 속한 각종 view나 viewGroup에 대한 UI 바인딩 작업을 할 수 있다.
  • (Layout을 inflate하여 view 작업을 수행한다.)

onActivityCreated() :

  • 액티비티에서 프래그먼트를 모두 생성하고 난 다음에 호출된다.
  • 즉 액티비티에서 onCreate() 다음에 호출되는 메소드이다.
  • 액티비티와 프래그먼트가 드디어 연결되는 시점이다.

onStart() :

  • 프래그먼트가 사용자에게 보여지기 전에 호출되는 함수
  • (액티비티와 같음)

onResume() :

  • 프래그먼트가 비로소 화면에 보이는 단계이다.
  • 사용자에게 focus를 잡은 상태
  • 사용자와의 상호작용이 가능

다른 프래그먼트가 치고 들어오는 경우(add되는 경우)

onPause() :

  • 프래그먼트는 사용자와의 상호작용을 중지한다.
  • 다시 돌아온다는 보장이 없으므로, 중요한 정보는 저장해둔다.

onStop() :

  • 프래그먼트는 더 이상 보여지지 않게 되며, 프래그먼트 기능은 중지한다.

onDestroyView() :

  • 프래그먼트를 view에서 제거한다.
  • Backstack을 사용했다면, 다시 해당 프래그먼트로 돌아올 때 onCreateView()가 호출된다.

onDestroy() :

  • 프래그먼트를 제거하기 직전이다.

onDetach() :

  • 프래그먼트를 비로소 제거하고 액티비티와의 연결도 해제한다.

과제

  1. 복습 : 세미나 시간동안 구현한 것 완성
  2. 응용 : Fragment안에 Fragment 구현
  3. 심화 : 첫 Fragment에서 이미지가 여러장일 경우에는 swipe를 통해 구현

Github : https://github.com/WooVictory/SOPT_22th_Seminar2_HomeWork