공식 문서 정리 : Activity Lifecycle (1)
Activity launched : 액티비티가 실행됩니다. 실행 후 액티비티는 '생성됨(CREATED)' 상태가 됩니다.
onCreate() : 액티비티를 생성 합니다. 실행 후 액티비티는 '시작됨(STARTED)' 상태가 됩니다. (필수 구현 콜백)
onStart() : 화면이 사용자에게 표시됩니다. 실행 후 액티비티는 '재개됨(RESUMED)' 상태가 됩니다.
onResume() : 사용자와 상호작용할 수 있는 상태가 됩니다.Activity running : 액티비티와 상호작용이 가능한 환경에 있습니다.
onPause() : 액티비티가 foreground에 있지 않으면 호출됩니다. 실행 후 액티비티는 '일시중지됨(PAUSED)' 상태가 됩니다.
onStop() : 액티비티가 완전히 화면을 벗어나면 호출됩니다. 실행 후 액티비티는 '중지됨(STOPPED)' 상태가 됩니다.
onDestroy() : 액티비티가 소멸되기 전(종료 또는 화면 회전) 호출됩니다.Activity shut down : 액티비티가 종료됩니다.
(내용 추가 필요.)
- 시작할 때 : onCreate → onStart → onResume
- 화면 회전할 때 : onPause → onStop → onDestory → onCreate → onStart → onResume
- 홈 버튼 클릭 시 : onPause → onStop
- 홈 이동 후 다시 돌아올 때 : onRestart → onStart → onResume
- 백 버튼 클릭하여 액티비티 종료 시 : onPause → onStop → onDestory
Activity A에서 Acitivity B를 시작할 때 메서드들의 호출 순서입니다.
예를 들면, 두 액티비티에서 공통적으로 사용되는 클래스나 DB를 사용할 때를 가정하겠습니다. Activity A가 onPause가 아닌 onStop에서 클래스, DB를 저장할 시 Activity B에서는 저장되지 않은 상태에서 데이터를 가져오게 되고 그 이후에 저장되기 때문에 다른 값들을 사용하게 됩니다. 따라서 액티비티 전환 시에 생명주기에 대해 잘 알고 사용하도록 해야합니다.
리소스 생성/제거는 대칭으로 실행
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에서 진행합니다.