본문 바로가기

프로그래밍/Android

Activity Lifecycle

Activity Lifecycle

  • 시스템의 Activity는 Activity Stack으로 관리된다.
  • 새로운 Activity가 시작되면 일반적으로 현재 스택의 맨 위에 배치되고 running Activity가 된다.
  • 이전 Activity는 항상 스택 아래에 남아 있으며 새로운 Acitivity가 종료 될 때까지 다시 foreground로 나오지 않는다.
  • 화면에 하나 이상의 activity stack이 표시될 수 있다.
  • Activity에는 기본적으로 4가지의 상태가 있다.
    • Activity가 화면의 foreground(최상위 스택의 가장 높은 위치)에 있는 경우 active 혹은 running 상태이다.
      • 일반적으로 사용자가 현재 상호 작용 하고 있는 activity 이다.
    • Activity가 포커스를 잃었지만 여전히 사용자에게 보여지는 경우, visible 상태이다.
      • 풀 사이즈가 아니거나 투명한 새로운 Activity가 이 Activity 위에 포커스를 맞추거나, 다른 Activity가 다중 윈도우 모드에서 더 높은 위치에 있거나, Activity 자체가 현재 윈도우 모드에서 포커스를 맞출 수 없는 경우 가능하다.
      • 이러한 Activity는 완벽하게 살아있다. (모든 상태 및 구성원 정보를 유지하고 윈도우 매니저에 계속 연결되어 있다)
    • Activity가 다른 Activity에 의해 완전히 가려지는 경우, stooped 혹은 hidden 상태이다.
      • 여전히 모든 상태 및 구성원 정보를 유지하지만 더 이상 사용자에게 표시되지 않으므로 해당 윈도우는 숨겨지며 다른 곳에서 메모리가 필요할 때 시스템에 의해 종종 종료된다.
    • 시스템은 완료를 요청하거나 단순히 프로세스를 종료하여 메모리에서 Activity를 삭제하는 경우, destroyed 상태이다.
      • 사용자에게 다시 표시되면 완전히 다시 시작하고 이전 상태로 복원해야 한다.
  • 하단의 다이어그램은 Activity의 중요한 상태 경로를 보여준다. 정사각형은 활동이 상태간에 이동할 떄 작업을 수행하기 위해 구현할 수 있는 콜백 메서드를 나타낸다. 컬러 타원은 Activity가 있을 수 있는 주요 상태이다.

  • Activity에서 모니터링 할 수 있는 3가지 핵심적인 Loop
  1. Activity의 entire lifetime은 onCreate(Bundle)에 대한 첫 번째 호출부터 onDestroy()에 대한 최종 호출까지이다.
    • Activity는 onCreate()에서 "global" 상태의 모든 설정을 수행하고 onDestroy()에서 나머지 모든 resources들을 해제한다.
    • 예를 들어, 네트워크에서 데이터를 다운로드 하기 위해 백그라운드에서 실행중인 스레드가 있는 경우 onCreate()에서 해당 스레드를 만든 다음 onDestroy()에서 스레드를 중지할 수 있다.
  2. Activity의 visible lifetime은 onStart() 호출부터 onStop() 호출까지이다.
    • 이 시간 동안 사용자는 화면에서 Activity를 볼 수 있지만 포그라운드에 있지 않고 사용자와 상호 작용할 수 있다.
    • 이 두 메서드 사이에서 사용자에게 Activity를 표시하는 데 필요한 resources를 유지할 수 있다.
    • 예를 들어, UI에 영향을 미치는 변경 사항을 모니터링 하기 위해 onStart()에 BroadcastReceiver를 등록하고, 사용자가 더 이상 표시중인 내용을 볼 수 없을 때 onStop()에서 등록을 취소할 수 있다.
    • onStart() 및 onStop() 메서드는 Activity가 사용자에게 표시되고 숨겨지므로 여러번 호출 될 수 있다.
  3. Activity의 foreground lifetime은 onResume() 호출부터 onPause() 호출까지이다.
    • Activity는 표시되고 활성화되며 사용자와 상호 작용한다.
    • Activity는 resume 된 상태와 pause된 상태 사이를 자주 이동할 수 있다.
    • 예를 들어, 기기가 절전 모드로 전환 될 때, Activity 결과가 전달될 때, 새로운 Intent가 전달 될 때 등이 있으므로 이러한 메서드의 코드는 상당히 가벼워야 한다.
  • Activity의 entire lifecycle은 하단의 Activity 메서드로 정의된다.
  • 이들 모두 Activity 상태가 변경될 때 적절한 작업을 수행하기 위해 재정의 될 수 있는 메서드들이다.
  • 모든 Activity는 초기 설정을 수행하기 위해 onCreate(Bundle)을 구현한다.
  • 대부분의 사람들이 onPause()를 구현하여 데이터 변경 사항을 commit하고 사용자와의 상호 작용을 일시 중지할 준비를 하고 onStop()을 구현하여 더 이상 화면에 표시되지 않도록 처리한다.
  • 이러한 메서드를 구현할 때는 항상 슈퍼클래스를 호출해야 한다.
 public class Activity extends ApplicationContext {
     protected void onCreate(Bundle savedInstanceState);

     protected void onStart();

     protected void onRestart();

     protected void onResume();

     protected void onPause();

     protected void onStop();

     protected void onDestroy();
 }
메서드설명Killable?다음 메서드
onCreate()Activity가 처음 생성 될 때 호출.
여기에서 View 생성, 리스트에서 데이터 바인딩 등 일반적인 정적 설정을 모두 수행해야 한다.
이 메서드는 Activity의 이전에 fronzen 상태(있는 경우)를 포함하는 번들도 제공한다.
항상 onStart()가 다음으로 호출된다.
OonStart()
onRestart()Activity가 stop된 후 다시 시작되기 전에 호출된다.
항상 onStart()가 다음으로 호출된다.
XonStart()
onStart()Activity가 사용자에게 visible될 때 호출된다.
Activity가 포그라운드로 오면 onResume()이 호출되고, hidden 상태면 onStop()이 호출된다.
XonResume() or onStop()
onResume()Activity가 사용자와 상호 작용을 시작할 때 호출된다.
이 시점에서 Activity는 사용자 입력으로 이동하는 Activity Stack의 맨 위에 있다.
항상 onPause()가 다음으로 호출된다.
XonPause()
onPause()Activity가 포그라운드 상태에서 변경되거나 더 이상 포커스를 맞출 수 없거나 stop / hidden 또는 destroy 상태로 전환되기 전에 호출된다.
Activity는 사용자에게 계속 보여지므로 시각적으로 활성 상태를 유지하고 UI를 계속 업데이트 하는 것이 좋다.
이 메서드가 반환 될 때까지 다음 Activity가 재개되지 않기 때문에 이 메서드는 매우 빨라야 한다.
Activity가 맨 앞으로 돌아오면 onResume()이 호출되고, 사용자에게 보이지 않으면 onStop()이 호출된다.
△(안드로이드 버전에 따라 다름)onResume() or onStop()
onStop()Activity가 더 이상 사용자에게 표시되지 않을 때 호출된다.
이는 새로운 Activity가 맨 위에서 시작되거나 기존 Activity가 이 Activity 앞에 나타나거나 이 Activity가 destroy되고 있기 때문에 발생할 수 있다.
일반적으로 애니메이션을 중지하고 UI를 새로 고치는 데 사용된다.
이 Activity가 사용자와 상호 작용을 하기 위해 돌아 오는 경우는 onRestart()를 호출하고 Activity가 사라지면 onDestroy()가 호출된다.
OonRestart() or onDestroy()
onDestroy()Activity가 destroy 되기 전 마지막으로 호출된다.
Activity가 종료중이거나(Activity#finish라고 불리는) 시스템이 공간을 절약하기 위해 Activity의 현재 인스턴스를 일시적으로 destroy하고 있기 때문에 발생할 수 있다.
isFinishing() 메서드를 사용하여 이 두 시나리오를 구분할 수 있다.
OX

Note : 위 표의 "Killable"이라고 불리는 열에서 O인 경우 해당 메서드가 Activity를 호스팅하는 프로세스를 반환 한 후 다른 코드 행이 실행되지 않고 언제든지 시스템에 의해 종료 될 수 있다. 이 때문에 onPause() 메서드를 사용하여 영구 데이터 (예 : 사용자 편집) 를 저장소에 저장해야 한다.
또한, onSaveInstanceState (android.os.Bundle) 메서드는 이러한 백그라운 상태에 Activity를 배치하기 전에 호출되므로 Activity의 동적 인스턴스 상태를 지정된 Bundle에 저장하여 나중에 onCreate(Bundle)에 수신할 수 있다.
ActonSaveInstanceState (Bundle) 대신 onPause ()에 영구 데이터를 저장하는 것이 중요하다. 전자는 수명주기 콜백의 일부가 아니므로 설명서에 설명 된 대로 모든 상황에서 호출되지 않는다.

'프로그래밍 > Android' 카테고리의 다른 글

[Kotlin] Idioms (관용구)  (0) 2021.08.25
[Kotlin] Basic syntax (기본 구문)  (0) 2021.08.24
Android RecylerView 새로고침 & 데이터 추가  (0) 2021.07.28
Android Service 관련 이슈(롤리팝 이상)  (0) 2021.04.20
Activity  (0) 2021.03.17