Hayden's Archive

[Android] 액티비티의 생명주기 본문

Study/ETC

[Android] 액티비티의 생명주기

_hayden 2021. 6. 6. 18:07

참고 : 한국방송통신대학교 모바일앱프로그래밍 교재( https://press.knou.ac.kr/goods/textBookView.do?condCmdtCode=9788920035999&condLscValue=001&condYr=&condSmst= )

 


안드로이드 멀티 태스킹

  • 안드로이드는 멀티태스킹 지원
    • 여러 개의 응용 프로그램을 동시에 실행 가능
  • 데스크톱 환경과는 달리 자원이 넉넉하지 않으므로 여러 가지 제약이 따름
    • 메모리의 크기가 작음
    • 많은 프로그램을 동시에 실행하기에는 무리가 있음
    • 화면이 좁아서 여러 개의 프로그램을 중첩시켜 보여줄 수 없으므로 한 번에 하나의 프로그램만 보임

 


생명주기(Life Cycle)

  • 여러 개의 프로그램을 동시에 실행할 수는 있지만 사용자의 눈에 보이고 직접 사용하는 프로그램은 언제나 하나
  • 대신 사용자는 배경의 프로그램을 활성화함으로써 교대로 실행할 수 있음
  • 액티비티는 시작, 실행, 활성, 비활성화, 정지, 종료되는 일련의 상태를 순환하는데 이것을 생명주기라고 함
  • 사용자의 선택이나 시스템의 자원 사정에 따라 액티비티의 상태는 끊임없이 바뀜

출처 : https://www.androidaura.com/activity-lifecycle-in-android/

 


액티비티 관리

  • 시스템은 태스크의 실행 중인 액티비티들을 스택으로 관리함
    • 액티비티가 새로 생성되면 스택의 제일 위에 놓여 활성화함
    • 이 상태에서 다른 액티비티가 또 생성되면 기존 액티비티는 잠시 가려지고 새 액티비티가 스택의 제일 위에 배치됨
    • 스택 제일 위의 액티비티가 종료되면 바로 아래쪽에 있는 액티비티가 활성화되어 화면에 보임
  • 스택의 액티비티는 넣고 빼기만 하며, 순서는 바뀌지 않음
  • 스택 상의 액티비티는 다음 세 가지 상태 중 하나임
    • 실행 상태(active, running)
      • 사용자가 직접 사용하는 상태
      • 스택의 제일 위에 있고, 화면상에서도 가장 위에 있음
      • 입력 포커스를 가지며 사용자의 입력을 직접 처리
    • 일시 정지 상태(pause)
      • 포커스는 잃었지만 사용자에게는 보이는 상태
      • 위쪽에 다른 액티비티가 있지만 화면 전체를 다 가리지 않았거나 반투명한 경우
      • 살아있는 상태와 같지만 시스템에 의해 강제 종료될 수도 있음
    • 정지(stopped)
      • 다른 액티비티에 의해 완전히 가려진 상태이며 사용자 눈에 보이지는 않는 상태
      • 그러나 모든 정보를 다 유지하고 있으므로 언제든지 다시 활성화될 수 있음
      • 시스템은 메모리가 부족하면 정지 상태의 액티비티를 언제든지 강제 종료할 수 있음
  • 액티비티 상태 관리 메서드
    • 액티비티는 처음 생성되어 완전히 파괴될 때까지 여러 메서드들을 순서대로 거침
    • 일부는 생략될 수도 있고 활성화 상태가 자주 바뀌면 onPause와 onResume은 여러 번 호출되기도 함
메서드 하는 일
onCreate 액티비티를 초기화한다.
중지했다가 재시작하는 경우라면 액티비티의 이전 상태 정보인 Bundle이 전달된다. 이 정보대로 재초기화한다.
onRestart 재시작될 때 호출된다. 특별히 할 일은 없다.
onStart 액티비티가 사용자에게 보이기 직전에 호출된다.
onResume 사용자와 상호작용을 하기 직전에 호출된다. 이 단계에서 스택의 제일 위로 올라간다.
onPause 다른 액티비티가 실행될 때 호출된다.
이 단계에서 미저장한 데이터가 있으면 저장하고 애니메이션은 중지해야 한다.
이 메서드가 리턴되어야 새 액티비티가 활성화되므로 시간을 너무 많이 끌어서는 안 된다.
onStop 액티비티가 사용자에게 보이지 않게 될 때 호출된다.
onDestroy 액티비티가 파괴될 때 호출된다.
시스템에 의해 강제로 종료되는 것인지 아니면 finish 메서드 호출에 의해 스스로 종료하는 것인지는 isFinishing 메서드로 조사할 수 있다.