본문 바로가기
안드로이드 프로그래밍/Android

[Android] 액티비티(Activity)와 생명주기(Lifecycle)

by 1chanhue1 2024. 9. 13.

안드로이드 앱은 크게  Activity, Service, Broadcast Receiver, Content Provider 4가지 컴포넌트로 구성된다.

안드로이드 앱 구성요소

각각의 컴포넌트들의 기능에 대해 간단히 설명하자면

Activity는 화면에 보여지는 부분의 기능,

Service는 화면이 없지만 동작하는 기능,

Broadcast Receiver는 시스템에서 전달하는 알림을 수신하는 기능,

Content Provider는 보안상의 문제로 선택적으로 시스템의 파일을 제공해주는 기능이라고 할 수 있다.

 

 

다시 말해서 Activtiy는 안드로이드 4대 컴포넌트 중 하나로 사용자와 상호작용을 하는 UI를 제공하는 역할을 합니다.

 

Acitivty
- 화면을 구성하는 가장 기본이 되는 요소
- 자동으로 activity 와 매칭되는 xml을 생성해준다 + manifest(설계도)에도 등록이 된다
- 화면을 그리는 기능 + 화면에서 발생할 수 있는 일(多)들을 처리할 수 있는 기능이 내장되어 있다.


특수한 Activity
   - 런처 activity, main activity
       - 앱이 실행될때 최초로 실행되는 activity

-----------------------------------------------------------------------------------------------------------------

 

 LifeCycle(생명주기)

     - activity에는 생명주기가 있다.
    -  안드로이드 OS가 activity를 직접 종료시키는 일은 없다.( 다만 프로세스는 종료가능)
       

 

 

생명 주기(LifeCycle)란 액티비티가 생성되는 순간부터 액티비티가 죽는 순간까지 단계를 나누어 놓았다. 액티비티에 생명 주기를 만들었을까? 우리가 앱을 사용할 때를 한번 생각해 보자. 카카오톡으로 친구들과 카톡을 하다가 유튜브 앱을 켜고 동영상을 보다가 네이버 앱을 켜서 뉴스 좀 보다가 다시 친구들과 카톡을 한다. 이때 앱이 종료되고 다시 켜지는 것이 아니라 다른 앱을 켜기 전의 화면으로 다시 돌아간다. 또한 뒤로 가기 버튼을 눌러도 이전 화면이 유지된 채로 보인다. 우리는 화면에서 안 보이는 순간 앱이 종료될 것이라고 생각하지만 그렇지 않다. 이처럼 액티비티는 단순하게 화면에서 사라진다고 해서 종료되는 것이 아니며, 사용자가 어떤 액션을 취했는지(뒤로 가기, 홈버튼, 다른 앱으로 전환 등)에 따라 앱을 재실행했을 때 보이는 화면과 데이터가 달라야 한다. 또한 앱이 비정상적으로 강제 종료될 때도 데이터를 백업할 시간이 필요한데, 이럴 때 액티비티 생명주기를 활용해서 처리할 수 있다.

 

 

    - onCreate()    

 - 필수적으로 구현을 해야한다(모든 생명주기(Lifecycle)에서 onCreate를 거치지 않고 다른 생명주기로 갈 수 없다)
         - 생명주기 중에서 단 한 번만 발생한다.
        - 단 한번만 하면 되는 일들을 여기에서 구현한다.
        - ex) 화면 그리기(초기화면), 데이터 준비


    - onStart()
        - activity를 포그라운드로 보내 상호작용할 수 있도록 준비
            - 포그라운드 : 사용자 눈에 보일 때의 상태 또는 사용중일 때의 상태 <-> 백그라운드
        - 이 과정은 매우 빠르게 완료가 된다


    - onResume()
        - 앱이 사용자와 상호작용이 가능한 상태
        - 특정 이벤트(전화가 온다거나, 기기 화면이 꺼질때)가 발생하여 앱에서 포커스가 떠나기 전까지 이 상태에 머무르게 된다
        - 화면이 가려지지 않으면 이 상태에 머문다


    - onPause()
        - 사용자가 activity를 떠나는 것을 나타내는 첫번째 신호
            - 엑티비티가 포그라운드에 있지 않다는 신호
        - 잠시 중지해야하는 작업이 있을 경우 수행하는 것이 좋다.
            - 영상 일시 중지, GPS 일시 중지


    - onStop()
        - activity가 더 이상 사용자에게 표시가 되지 않는 상태
            - 새로운 activity가 나오는 경우(새로운 앱을 킨다거나, 같은 내 앱에서 화면이 

               바뀌는 경우도 해당됨)
            - 화면이 가려지는 경우(중간에 전화가 온다던가)
        - 사용자에 보이지 않는 동안 앱은 리소스를 해제 해야한다
            - 영상 종료, GPS 종료
        - 마지막으로 해야 할일 등을 수행하는 것이 좋다.
            - 저장을 하는 기회


    - onDestroy()
        - 엑티비티가 소멸되기 전에 호출된다
            - 기기회전 또는 멀티 윈도우 모드(여러앱을 한 화면에 킬 수 있는..)에서 시스템이 

               일시적으로 activity를 소멸시는 경우
            - onStop에서 해제되지 않은 모든 리소스를 해제해야 한다




 

 

 

생명주기 메서드 호출 순서 정리 

 

 

  • 시작할 때 : onCreate  →  onStart  →  onResume
  • 화면 회전할 때 : onPause  →  onStop  →  onDestory  →  onCreate  →  onStart  →  onResume
  • 홈 버튼 클릭 시 : onPause  →  onStop
  • 홈 이동 후 다시 돌아올 때 : onRestart  →  onStart  →  onResume
  • 백 버튼 클릭하여 액티비티 종료 시 : onPause  →  onStop  →  onDestory

 

생명주기 예제

1) LoginActivity에서 RegisterActivity를 호출했을 때 라이프 사이클 호출 순서를 나열하시오.

2) RegisterActivity 종료 후 다시 LoginActivity가 보여질 때 라이프사이클 호출 순서를 나열하시오.


문제 링크는 해당 블로그를 참고했습니다. 

https://velog.io/@its-mingyu/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-Activity-Lifecycle












예시 1번 답

[login] onPause()
[register] onCreate()
[register] onStart()
[register] onResume()
[login] onStop()

  • registerActivity를 호출하면 우선 loginActivity를 onPause()합니다.
  • 그런 다음 registerActivity를 onCreate()하고,
  • 생성된 registerActivity를 onStart()하고,
  • 시작한 registerActivity를 onResume()합니다.
  • registerActivity가 onResume()되며 포커스인 상태이기 때문에, 비로소 loginActivity는 onStop() 상태에 들어가게 됩니다.

예시 2번 답

[register] onPause()
[login] onRestart()
[login] onStart()
[login] onResume()
[register] onStop()
[register] onDestroy()

  • 다시 loginActivity를 호출하면 우선 registerActivity를 onPause()합니다.
  • loginActivity는 onDestroy()되지 않고 onStop() 된채로 백그라운드에서 돌아가고 있기 때문에, onRestart()를 수행합니다.
  • 그런 다음 onRestart()된 loginActivity를 onStart()하고,
  • onStart() 상태의 loginActivity를 onResume()합니다.
  • loginActivity가 onResume() 상태가 되어 사용자가 registerActivity로부터 포커스아웃 되었기 때문에 비로소 registerActivity는 onStop() 상태가 됩니다.
  • registerActivity를 종료하면 onDestroy() 호출 후 완전히 종료됩니다.