Do IT SOPT — Android seminar 2

2차 세미나는 안드로이드 앱에서 빠질 수 없는 중요한 ActivityFragment에 대한 내용을 다루고 있으며, 안드로이드의 4대 컴포넌트라는 것에 대해서 배웠습니다. 제가 비록 세미나는 가지 못하였지만 공부한 내용을 토대로 정리할 예정입니다! :)


2차 세미나 in 숭실대학교

  • 안드로이드 4대 컴포넌트와 Intent
  • Activity란?
  • Fragment 알아보기

안드로이드의 4대 컴포넌트를 알아보자

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

안드로이드의 앱은 컴포넌트(Component)로 구성되어 있으며, Activity, Service, Broadcast Receiver, Content Provider가 있습니다. 각 컴포넌트들은 하나의 독립된 형태로 존재하며, 정해진 역할을 수행합니다. 그러면 이제 이 컴포넌트들 간의 상호 통신은 어떻게 하는지 궁금할텐데요. 그것은 바로 Intent라는 일종의 메시지 객체를 사용하여 상호 통신을 진행합니다.


이제부터 안드로이드의 컴포넌트들에 대해서 알아보도록 하겠습니다.

(1). Activity

  • UI가 있는 앱의 단일 화면
  • 안드로이드 앱은 반드시 하나의 Activity를 가지고 있어한다.
  • 하나의 앱에 여러 Activity가 존재하지만 각자 독립적으로 존재
  • Manifest 파일에 Activity가 반드시 등록되어야 한다.
  • 생명주기를 갖는다.[아래 설명 참조!]

(2). Service

  • UI가 제공되지 않는다.
  • 백그라운드에서 실행되는 구성 요소.
  • 오랫동안 실행되는 작업이나 원격 프로세스를 위한 작업 수행
  • 생명주기를 갖는다.
  • 대표적인 Service는 백그라운드에서 음악 재생.
  • Manifest 파일에 Servcie를 등록해야 한다.

(3). Content Provider

  • 공유된 App 데이터 집합 관리.
  • 우리의 여러 다른 앱끼리 데이터를 공유.
  • 대표적인 것은 안드로이드 시스템이 사용자 연락처 정보를 관리하는 Content Provider를 제공하는 것이다. [다른 앱에서 연락처 정보 읽기!]

(4). Broad Cast Receiver

  • 디바이스에서 발생하는 일 중에서 애플리케이션이 알아야 하는 상황이 발생하면 알려준다.
  • 대부분 UI가 존재하지 않는다.

Intent

  • 안드로이드의 컴포넌트들 간에 소통을 할 수 있는 일종의 메시지 객체
  • 컴포넌트들 간에 작업을 요청할 수 있다.
  • 액션[수행할 기능]과 데이터[액션이 수행될 대상 데이터]로 구성되어 있다.

(1). 명시적 인텐트

  • App 내 특정 Activity나 Service 등 특정 구성 요소를 시작하기 위해서 사용하는 인텐트
  • 클래스 객체나 컴포넌트 이름을 지정하여 호출할 대상을 확실히 알 수 있는 경우에 사용.

주로 애플리케이션 내부에서 사용하며, 사용하는 이유는 특정 컴포넌트나 Activity가 명확하게 실행되어야 할 경우에 사용한다.

(2). 암시적 인텐트

  • 인텐트의 액션과 데이터를 지정했지만, 호출할 대상이 달라질 수 있는 경우에 사용.

즉 설치된 애플리케이션에 대한 정보를 알고 있는 안드로이드 시스템이 인텐트를 이용해 요청한 정보를 처리할 수 있는 적절한 컴포넌트를 찾아본 다음 사용자에게 그 대상과 처리 결과를 보여주는 과정을 거치게 됩니다.


대표적인 예로 PDF 편집기가 있다. PDF 파일을 받아서 클릭하여 열면 안드로이드 폰에 PDF를 편집하거나 열 수 있는 많은 애플리케이션이 자신이 PDF를 열 수 있다고 손을 드는데, 안드로이드 시스템에서는 PDF를 열 수 있는 많은 앱들 중에서 어떤걸 선택할 지 보여주는 위젯을 띄워 줍니다. 이와 같은 일련의 과정을 가능하게 하는 친구가 암시적 인테트입니다.


Activity란?

Activity에 대한 설명은 안드로이드 4대 컴포넌트를 설명하면서 간략한 설명을 하였습니다. 그러므로 이번에는 중요한 개념인 Activity의 생명주기에 대한 내용을 살펴보겠습니다.

Activity’s LifeCycle
onCreate()
  • Activity 생성된 후 최초에 실행될 때 호출된다.[한번만 호출됨]
  • 필요한 리소스들을 초기화하거나 화면에 보이는 View들의 일반적인 상태들을 여기서 설정한다.
  • 이전 상태가 저장되어 있을 경우, 번들 객체를 참조하여 이전 상태로 복원 가능
  • 이 다음에는 항상 onStart()가 호출된다.
onStart()
  • Activity가 사용자에게 보여지기 바로 직전에 호출된다.
  • 매우 빠르게 끝나며, onResume() 단계로 넘어간다.
  • Activity가 시작되기 전에 호출되는 함수 / Activity가 멈춘 후 다시 시작되기 전에 호출되는 함수.
  • 보통 Broadcast Receiver 등록은 여기서 하는게 좋다고 한다.
onResume()
  • Activity가 사용자와 상호 작용하기 바로 직전에 호출된다.
  • 이 메소드 호출 후, 비로소 Activity가 화면에 보여진다.
  • 사용자에게 focus를 잡은 상태.
onRestart()
  • Activity가 중지된(stopped) 이후에 호출되는 메소드로 다시 시작되기 바로 전에 호출된다.
  • 여기서 중지된 상태는 Activity가 완전히 가려졌을 때를 의미한다.
  • Activity가 멈춰 있다가 다시 호출될 때 불리는 함수다.
  • onRestart() 다음에는 onStart()가 호출된다.

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

onPause()
  • Activity 위에 다른 Activity가 올라와서 focus를 잃었을 때 호출되는 함수
  • Activity가 완전히 가려지지 않고 부분만 가려진 상태에서 호출되는 함수, 즉 일부분이 보이거나 투명상태일 경우에 호출된다.
  • 영구적인 Data를 여기서 저장한다.
  • 이 함수가 리턴되기 전에는 다음 Activity가 시작될 수 없으므로 이 작업은 빠르게 처리되어야 한다.
  • Activity가 이 상태에 들어가면 시스템은 Activity를 강제 종료할 수 있다.
onStop()
  • Activity 위에 다른 Activity가 올라와 완전히 가려질 때 호출되는 함수
  • 즉, Activity가 사용자에게 더 이상 보이지 않을 때 호출된다.
  • 이 상태에서 Activity가 다시 불려지면 onRestart()함수가 호출된다.
  • 추가적으로, 시스템이 onStop() 상태에 들어오면, onSaveInstanceState()라는 메소드를 호출하는데, 이 단계에서는 key-value 형태로 값을 저장하고, 이 값을 onCreate()에서 복원할 수 있다.
onDestroy()
  • Activity가 스택에서 완전히 없어질 때 호출되는 함수.
  • 즉, 제거되는 경우에 해당한다.
  • finish() 메소드가 호출되거나 시스템 메모리 확보를 위해서 시스템이 강제로 종료시키는 경우에 호출될 수 있다.

Fragment란?

  • Fragment는 하나의 Activity가 여러 개의 분할된 화면을 가지도록 만들기 위해 고안된 개념이다.
  • 다양한 크기의 화면을 가진 모바일 환경이 늘어나고 태블릿의 큰 화면에 대한 Activity의 비효율성이 부각되었다.
  • 이처럼 하나의 디스플레이 화면 안에서 다양한 화면을 보여주고 싶은 니즈를 충족시키기 위해 등장했다.
  • Fragment를 사용하면 다른 Activity에서도 재사용할 수 있다는 장점이 있다.
  • 전체 화면인 Activity에서 부분 화면을 만드는데 주로 사용된다.
  • Fragment는 항상 Activity 위에 올라가 있어야 한다.
  • 자체 생명주기를 갖지만, Activity의 생명주기에 종속적이다.
  • Activity가 소멸되면 그 위의 Fragment도 소멸된다.

Fragment는 안드로이드 4대 컴포넌트에 속하는 구성 요소가 아니다. 따라서 Intent를 사용하여 값을 전달할 수 없다. 이를 위해서 고안된 것이 Bundle이라는 것이다. Fragment는 Bundle이라는 객체를 통해서 Fragment 간의 데이터 전달을 수행한다.

Fragment’s LifeCycle
onAttach()
  • Fragment가 Activity에 붙을 때 호출된다.
  • 하지만, 아직 완벽하게 생성된 것은 아니다.
onCreate()
  • 본격적으로 Fragment가 Activity의 호출을 받아 생성되는 시점이다.
  • Fragment의 생명주기는 Activity 생명주기에 종속적이라고 앞에서 언급했다. 이 단계에서는 Activity도 생성 중에 있는 시기이기 때문에 Activity에 있는 컨트롤을 참조하거나 Fragment의 요소들을 초기화할 때 불안정한 경우가 있다.
  • Activity의 onCreate()에서는 view, UI 작업을 할 수 있지만, Fragment의 onCreate()에서는 할 수 없다.
onCreateView()
  • Fragment에 속한 각종 view나 viewGroup에 대한 UI 바인딩 작업을 할 수 있다.
onActivityCreated()
  • Activity에서 Fragment를 모두 생성하고 난 다음에 호출된다.
  • Activity에서 onCreate() 다음에 호출되는 메소드.
  • Activity와 Fragment가 드디어 연결되는 시점이다.
onStart()
  • Fragment가 사용자에게 보여지기 전에 호출되는 함수.
onResume()
  • Fragment가 비로소 화면에 보이는 단계이다.
  • 사용자에게 focus를 잡은 상태.
  • 사용자와의 상호작용이 가능하다.
onPause()
  • Fragment는 사용자와의 상호작용을 중지한다.
  • Fragment가 중지되는 시점을 정의한다. Fragment의 정지가 반드시 소멸을 의미하는 것은 아니지만, 다시 해당 Fragment로 돌아온다는 보장도 없기 때문에 이 시점에서 남겨두어야 하거나 보존해야 할 자료들을 저장한다.
onStop()
  • Activity에 의해 stop되었거나 Fragment의 수행이 Activity에 의해 수정되었을 경우로 Fragment는 더 이상 보이지 않게 되며, Fragment 기능은 중지한다.
onDestroyView()
  • Fragment가 화면에서 안 보이고 View의 현재상태가 저장된 후 호출된다.
  • Fragment의 View들을 제거한다.
  • Back Stack을 사용했다면, 해당 Fragment로 돌아올 때 onCreateView()가 호출된다.
onDestroy()
  • Fragment를 더 이상 사용하지 않을 때 호출된다.
  • Activity와 연결이 끊어진 상태는 아니지만 Fragment는 동작하지 않는다.
  • Fragment를 제거하기 직전.
onDetach()
  • onDetach가 호출된 후, Fragment를 비로소 제거하고 Activity와의 연결도 해제한다.
  • 부모 Activity가 생명주기를 완전하게 마치지 않고 종료되었다면 onDetach()는 호출되지 않을 수도 있다.

추가적으로 실습 코드는 이번 주 내로 올릴 예정입니다.:)

https://github.com/WooVictory/Doit_23th_SOPT 여기서 확인해주세요!