onCreate() 는 시스템이 앱을 생성할 때 호출.
모든 Activity 에서 구현해야 하는 기본 메서드이다. onCreate() 메서드에서 활도으이 일회성 초기화를 실행해야 한다. onCreate() 에서 Activity 의 UI 레이아웃을 지정하는 setContent() 를 호출한다.
Logcat 에 메시지를 쓴다. 개발자가 로그에 명시적으로 젆송하는 메시지를 비롯하여, 앱에 관한 Android 의 메시지가 표시된다.
Activity 최상위에 상수 추가
private const val TAG = "MainActivity"
onCreate() 메서드에서 super.onCreate() 호출 바로 뒤에 Log 찍기
Log.d(TAG, "onCreate Called")
필요한 경우 Log 클래스 가져오기
import android.util.Log
Log message
MainActivity com.example.dessertclicker D onCreate Called
onStart() 는, 앱이 화면에 표시되도록 하지만, 사용자는 아직 앱과 상호작용 할 수 없다.
onCreate() 직후 호출. onStart() 가 실행되면 Activity 가 화면에 표시된다.
onCreate() 는 한번만 호출되지만, onStart() 는 수명 주기동안 여러번 호출할 수 있다.
Log message
MainActivity com.example.dessertclicker D onCreate Called
MainActivity com.example.dessertclicker D onStart Called
MainActivity com.example.dessertclicker D onStart Called
활동이 처음부터 시작되면 다음 세 가지 수명 주기 콜백이 순서대로 모두 호출된다.
onCreate(): 시스템이 앱을 생성할 때 호출(앱 열릴때)
onStart(): 앱이 화면에 표시되도록 하지만 사용자는 아직 앱과 상호작용할 수 없다.(Create 랑 같이 시작되는 메서드. 백그라운드 상태에서 다시 들어가도 실행된다.)
onResume(): 앱을 포그라운드로 가져오고 사용자는 이제 앱과 상호작용할 수 있다.
이름과 달리 onResume() 메서드는 다시 시작할 대상이 없어도 시작 시 호출
MainActivity com.example.dessertclicker D onCreate Called
MainActivity com.example.dessertclicker D onStart Called
MainActivity com.example.dessertclicker D onResume Called
활동이 처음 시작되면 onCreate(), onStart(), onResume() 콜백이 호출된다. 이후 기기에서 뒤로 버튼을 탭하면
MainActivity com.example.dessertclicker D onPause Called
MainActivity com.example.dessertclicker D onStop Called
Logcat 에서 onPause(), onStop() 이 순서대로 호출된다.
Activity(app) 이 화면에서 삭제되고 stack 의 뒤로 이동한다.
코드 내에서 Activity 의 finish() 메서드를 수동으로 호출하거나, 사용자가 앱을 강제 종료하면 Android OS 에서는 Activity 를 닫을 수 있다.
ex) 사용자는 최근 화면에서 앱을 닫거나 강제종료 가능, 앱이 장시간 화면에 표시되지 않으면 OS 에서 자체적으로 Activity 종료
이를 통해 Android 는 배터리 수명을 보존하고, 리소스를 회수하여 다른 앱에서 사용할 수 있도록 한다.
사용자가 Android 기기와 상호작용할 때는 앱 간 전환, 홈으로 돌아가기, 새 앱 시작, 다른 활동(전화 통화) 등으로 인한 중단을 처리한다. Activity 는 사용자가 Activity 에서 벗어날 때마다 완전히 닫히지 않는다.
사용자가 돌아오면 동일한 Activity 가 다시 시작되어 화면에 표시된다. lifecycle 에서 이 부분을 app's visible lifecycle(앱의 표시 수명)이라고 한다.
앱은 백그라운드에 있을 때, 시스템 리소스와 배터리 수명을 보존한다. Activity lifecycle 과 콜백을 사용하여 앱이 백그라운드로 이동하는 시점을 알 수 있다. 진행 중인 작업을 일시 중지(onPause, onStop) 할 수 있다.
onPause() 가 호출되면 앱에 더 이상 포커스가 없다. onStop() 이후에는 앱이 더 이상 화면에 표시되지 않는다. Activity 가 중지되었지만 Activity 객체는 여전히 백그라운드에 메모리에 있다. 사용자가 앱으로 돌아올 수 있으므로 Android 는 활동 리소스를 유지한다.
최근 화면을 사용하여 앱으로 돌아가면 Logcat 활동은 onRestart() 및 onStart() 로 다시 시작된 후 onResume() 으로 재개된다.
MainActivity com.example.dessertclicker D onRestart Called
MainActivity com.example.dessertclicker D onStart Called
MainActivity com.example.dessertclicker D onResume Called
Activity 가 Foreground 로 돌아오면 onCreate() 메서드 대신 onRestart() 메서드가 호출된다.
-> onPause() 와 onStop() 은 앱이 백그라운드로 전환될 때 호출된다. onRestart(), onStart(), onResume() 이 호출된다. onStart() 와 onStop() 은 사용자가 Activity 에서 나가거나 Activity 로 이동할 때 여러 번 호출된다.
onStart() 가 호출되면 앱이 화면에 표시. onResume() 이 호출되면 앱은 사용자 포커스를 획득한다. (사용자가 앱과 상호작용)
이처럼, 완전히 화면에 표시되고 사용자 포커스를 보유하는 life cycle 을 foreground lifetime 이라고 한다.
앱이 백그라운드로 이동하면 onPause() 후 포커스가 상실되고 onStop() 후에는 앱이 표시되지 않는다.
포커스와 가시성의 차이는 중요하다. Activity 가 화면에 부분적으로 표시되지만 사용자 포커스는 없을 수 있다.
MainActivity com.example.dessertclicker D onPause Called
Activity 가 계속 부분적으로 표시되기 때문에, onStop() 은 호출되지 않는다. 그러나 Activity 에 사용자 포커스가 없어 사용자가 상호작용할 수 없다. foreground 에 있는 '공유'활동에 사용자 포커스가 있다.
onPause() 만 사용한 중단은, Activity 로 돌아가거나 다른 Activity 또는 앱으로 이동하기 전에 잠시 지속된다. 일반적으로 UI 를 계속 업데이트하여, 나머지 앱이 멈춘 것처럼 보이지 않도록 하는 것이 좋다.
onPause() 에서 실행되는 모든 코드가 다른 항목이 표시되는 것을 차단하므로 onPause() 의 코드는 가볍게 유지한다. ex) 전화가 오면 onPause() 의 코드는 수신 전화 알림을 지연
공유 대화상자 외부를 클릭하여 앱으로 돌아가면 onResume() 이 호출된다. onResum() 과 onPause() 는 모두 포커스와 관련이 있다. onResume() 은 Activity 에 포커스가 있을 때 호출되고, onPause() 는 Activity 에 포커스가 없을 때 호출된다.
onStart() 가 호출되면 앱이 화면에 표시된다. onResume() 이 호출되면 앱은 사용자 포커스를 획득한다. 즉 사용자가 앱과 상호작용할 수 있다.
앱이 완전히 화면에 표시되고 사용자 포커스를 보유하는 수명 주기 부분을 포그라운드 전체 기간이라고 한다.
앱이 백그라운드로 이동하면 onPause() 후에 포커스 상실, onStop() 후에 더 이상 앱이 표시되지 않는다.
포커스와 가시성의 차이가 중요하다. 활동이 화면에 부분적으로 표시되지만 사용자 포커스는 없을 수 있다. 예를 들어 공유 버튼을 누르면 shareActivity 는 화면 아래쪽 절반에 표시되지만, Activity 는 위쪽 절반에 표시된다. Logcat 확인 시 onPause() 만 호출된다. Activity 가 부분적으로 표시되나, 사용자 포커스가 없어 사용자가 상호작용할 수 없다. 포그라운드에 있는 shareActivity 에 사용자 포커스가 있다.
이 차이가 중요한 이유는 onPause() 만 사용한 중단은 보통 Activity 로 돌아가거나 다른 Activity 또는 앱으로 이동하기 전에 잠시 지속된다. 일반적으로 UI 를 계속 업데이트하여 나머지 앱이 멈춘 것처럼 보이지 않도록 하는 것이 좋다.
onPause() 에서 실행되는 모든 코드가 다른 항목이 표시되는 것을 차단하므로 onPause() 의 코드를 가볍게 유지한다. 예를 들어 전화가 걸려오면 onPause() 의 코드는 수신 전화 알림을 지연시킬 수 있다.
다시 Activity 로 돌아가면 onResume() 이 호출된다.
-> onResume()과 onPause()는 모두 포커스와 관련이 있다. onResume() 메서드는 활동에 포커스가 있을 때 호출되고 onPause()는 활동에 포커스가 없을 때 호출된다.
구성 변경이 Activity life cycle 에 영향을 미치기도 한다.
구성 변경은, 기기 상태가 급격하게 변경되어 시스템이 변경 사항을 확인하는 가장 쉬운 방법이 활동을 완전히 종료하고 다시 빌드하는 것일 때 발생한다.
ex) 언어 변경 시 텍스트 방향과 문자열 길이 변화로 인해 전체 레이아웃 변경, 가로세로 화면모드 변경
onDestroy() 는 onStop() 후 호출되며, Activity 소멸 직전 호출된다.
MainActivity com.example.dessertclicker D onPause Called
MainActivity com.example.dessertclicker D onStop Called
MainActivity com.example.dessertclicker D onDestroy Called
구성 변경으로 인한(여기서는 화면 회전) onDestroy() 호출 후 Logcat 을 검토하면 onPause(), onStop(), onDestroy() 가 순서대로 호출된다.
MainActivity com.example.dessertclicker D onCreate Called
MainActivity com.example.dessertclicker D onStart Called
MainActivity com.example.dessertclicker D onResume Called
MainActivity com.example.dessertclicker D onPause Called
MainActivity com.example.dessertclicker D onStop Called
MainActivity com.example.dessertclicker D onDestroy Called
MainActivity com.example.dessertclicker D onCreate Called
MainActivity com.example.dessertclicker D onStart Called
MainActivity com.example.dessertclicker D onResume Called
onDestroy() 가 호출되면, 모든 life cycle 콜백을 호출하여 Activity 를 종료한다. 그 다음 Activity 가 다시 만들어질 때, 시스템은 모든 life cycle 콜백을 호출하여 Activity 를 시작한다.
Activity 는 기본값으로 다시 시작된다. (디저트 이미지, 판매량, 총 수익이 0으로 재설정)