[개념] Activity Lifecycle (2)

쓰리원·2022년 5월 28일
0

Lifecycle

목록 보기
4/4
post-thumbnail

공식 문서 정리 : Activity Lifecycle (1)

1. Activity LifeCycle Callback

Activity launched : 액티비티가 실행됩니다. 실행 후 액티비티는 '생성됨(CREATED)' 상태가 됩니다.

onCreate() : 액티비티를 생성 합니다. 실행 후 액티비티는 '시작됨(STARTED)' 상태가 됩니다. (필수 구현 콜백)
onStart() : 화면이 사용자에게 표시됩니다. 실행 후 액티비티는 '재개됨(RESUMED)' 상태가 됩니다.
onResume() : 사용자와 상호작용할 수 있는 상태가 됩니다.

Activity running : 액티비티와 상호작용이 가능한 환경에 있습니다.

onPause() : 액티비티가 foreground에 있지 않으면 호출됩니다. 실행 후 액티비티는 '일시중지됨(PAUSED)' 상태가 됩니다.
onStop() : 액티비티가 완전히 화면을 벗어나면 호출됩니다. 실행 후 액티비티는 '중지됨(STOPPED)' 상태가 됩니다.
onDestroy() : 액티비티가 소멸되기 전(종료 또는 화면 회전) 호출됩니다. 

Activity shut down : 액티비티가 종료됩니다.
(내용 추가 필요.)

2. 생명주기 메서드 호출 순서

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

3. 액티비티 전환 시 생명주기 메서드 호출

Activity A에서 Acitivity B를 시작할 때 메서드들의 호출 순서입니다.

  • Activity A는 onPause 메서드를 실행합니다. (Activity A가 백그라운드로 이동)
  • Activity B는 onCreate, onStart, onResume 메서드를 실행하여 포그라운드 상태가 됩니다.
  • Activity B가 onResume까지 호출된 이후에는 포그라운드 상태가 되고 전체 화면을 가득 채우기 때문에 Activity A가 onStop 메서드가 호출되게 됩니다.

예를 들면, 두 액티비티에서 공통적으로 사용되는 클래스나 DB를 사용할 때를 가정하겠습니다. Activity A가 onPause가 아닌 onStop에서 클래스, DB를 저장할 시 Activity B에서는 저장되지 않은 상태에서 데이터를 가져오게 되고 그 이후에 저장되기 때문에 다른 값들을 사용하게 됩니다. 따라서 액티비티 전환 시에 생명주기에 대해 잘 알고 사용하도록 해야합니다.

4. 생명주기 메서드 사용시 주의사항

  • 리소스 생성/제거는 대칭으로 실행

    onCreate에서 리소스 생성했으면 onDestory에 해제를 하고 onResume에 생성하면 onPause에 제거를 해서 대칭적으로 코드를 작성해야 합니다. DB를 onCreate에서 열었고 onPause가 되면 닫는다고 가정했을 때 재시작이 되면 닫힌 DB를 열기 때문에 문제가 발생할 수 있습니다. 즉, onCreate에서 DB를 열었다면 onDestory에 닫도록 해야 합니다.

  • finish() 메서드 호출 후 return 필수

    finish 함수로 액티비티 종료 시에 finish 메서드는 시스템에 액티비티를 종료하라는 메시지를 보낼 뿐 리턴을 하는게 아닙니다. finish 메서드 이후에도 로직이 있다면, 해당 로직이 수행될 수 있으며 정상적인 결과를 얻지 못하거나, 오류가 발생하게 될 수 있습니다. 따라서 finish 메서드를 호출했다면 return을 필수로 추가하여 이후 로직이 실행되지 않도록 해야 합니다.

  • onStart() 와 onResume() 함수의 구분점

    onStart()는 액티비티가 사용자에서 보여지기 직전에 호출됩니다. onResume()은 사용자에게 보이지만 사용자와 상호작용하기 직전상태일 때 실행됩니다.

  • onPause 사용의 제한 사항

    onPause는 데이터 저장, 네트워크 호출, 데이터베이스 실행을 하면 안됩니다. 공식문서에서는, onPause가 위의 일을 수행할 만큼의 충분한 시간을 가지지 못한다고 합니다. 이런 무거운 일들은 onStop에서 진행합니다.

5. reference

https://gift123.tistory.com/61?category=967702

profile
가장 아름다운 정답은 서로의 협업안에 있다.

0개의 댓글