액티비티(Activity)
액티비티(Activity)는 사용자가 애플리케이션과 상호작용하는 UI 화면을 제공하는 컴포넌트이다.
액티비티는 생명주기 관련 메소드들을 재정의하여 원하는 기능들을 구현할 수 있다.
main()메서드를 사용하여 앱을 실행하는 프로그래밍 패러다임과 달리 Android 시스템은 수명 주기의 특정 단계에 해당하는 콜백 메서드를 호출하여 Activity의 인스턴스 코드를 시작한다.
액티비티(Acitivty)의 생명주기
onCreate()
액티비티가 생성될 때 onCreate()가 호출된다. 실행 후 '생성됨(CREATED)' 상태가 된다.
이 콜백에서 액티비티 내의 모든 요소들을 이 메소드 내에서 초기화 시킬 수 있다.
대표적으로 뷰를 생성하고 데이터를 바인딩하는 작업을 할 수 있다. (findViewById, DataBinding 등)
'Data를 바인딩한다'의 의미
Data: 데이터
Binding: 묶음
->xml의 컴포넌트 요소들과 java를 묶어 주는 것
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// DataBinding 은 setContentView 가 필요없다.
//setContentView(R.layout.activity_main);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setActivity(MainActivity.this);
binding.mainTxvBindingTest.setText("Test");
//뷰모델도 onCreate()에서 연결함
UserViewModel userViewModel = ViewModelProvider(this).get(UserViewModel::class.java)
}
onStart()
onCreate()가 종료되면 Activity는 '시작됨(STARTED)' 상태로 되며, 액티비티가 화면에 표시되기 시작하면 onStart() 함수가 호출된다.
이 콜백에서 앱은 Activity를 포그라운드에 보내 사용자와 상호작용할 수 있도록 준비한다.
예를 들어 이 메서드에서 앱이 UI를 관리하는 코드를 초기화 한다.
onPause()
액티비티가 포커스를 잃으면(포그라운드에 있지 않을 때) 일시중지됨(PAUSED) 상태가 되고 onPause()가 호출된다.
액티비티가 완전히 가려져 더이상 보이지 않는다면 omStop()를 호출하고 다시 Activity가 활성화되면 onResume() 콜백이 호출 된다.
onPause() 상태에 있다가 메모리가 부족하게 되면 Process Kill을 하여 메모리를 반환한다.
- Dialog와 같이 액티비티를 다 가리지 않는 화면이 표시되었을 때는 onPause()까지만 호출한다.
onPause()에서 저장하는 Task를 해도 될까?
: onPause()는 아주 잠깐 실행되므로 저장 작업을 실행하기에는 시간이 부족할 수 있다. 그러므로 onPause()를 사용하여 애플리케이션 또는 사용자 데이터를 저장하거나, 네트워크 호출을 하거나, 데이터베이스 트랜잭션을 실행해서는 안된다. 이러한 작업은 메소드 실행이 끝나기 전에 완료되지 못할 수도 있다. 따라서, 부하가 큰 종료 작업은 onStop()상태일 때 실행해야한다.
onStop()
액티비티가 더 이상 사용자에게 보이지 않을 때 onStop()가 호출되는 메소드이다. 다른 액티비티로 전환시 스택에 다른 액티비티가 쌓여 가려지게 되면 호출된다.
액티비티가 완전히 종료될 때 onDestroy()를 호출하고, 다시 액티비티가 활성화되면 onRestart()가 호출된다.
- 다른 Activity가 기존 Activity를 가려서 보이지 않게 되면 onStop()까지 호출한다.
onDestroy()
액티비티가 종료되기 전에 이 onDestroy() 함수가 호출된다.
일반적으로 이 단계에서 액티비티의 모든 리소스를 해제하는 작업을 구현한다.
액티비티가 종료 됐는데 백그라운드 작업 스레드가 동작하는 경우 시스템의 리소스가 소비되므로 onStop() 또는 onDestory()에서 중지 시켜준다.
onDestroy()는 다음 상황일 때 호출된다.
- 사용자가 Activity를 완전히 닫은 경우
- Acitivty에서 finish()를 호출하여 Activity가 종료되는 경우
- 기기 회전 멀티 윈도우 모드(Configuration change)로 인해 시스템이 일시적으로 Acitivty를 소멸시키는 경우
onRestart()
액티비티가 정지된 후 (onStop 이후) 다시 시작하기 전에 onRestart() 함수가 호출된다.
액티비티 생명주기를 적절히 사용해야 하는 이유
생명주기의 각 콜백은 상태 변화에 적합한 특정 작업을 실행할 수 있도록 한다.
적시에 알맞은 작업을 하고 적절하게 전환을 하면 앱이 더욱 안정적으로 기능할 수 있다.
수명주기 콜백을 올바르게 구현하면 앱에서 다음의 문제를 예방할 수 있다.
- 사용자가 앱을 사용하는 도중에 전화가 걸려오거나 다른 앱으로 전환할 때 비정상 종료되는 문제
- 사용자가 앱을 활발하게 사용하지 않는 경우 귀중한 시스템 리소스가 소비되는 문제
- 사용자가 앱에서 나갔다가 나중에 돌아왔을 때 데이터가 저장되지 않는 문제
- 예를 들어, 스트리밍 동영상 플레이어를 보고 있다가 사용자가 다른 앱으로 전환할 때, 동영상을 일시 중지하고 네트워크를 종료시켜야한다(onStop). 사용자가 돌아오면 네트워크를 다시 연결하고 사용자가 일시중지한 지점에서 동영상을 다시 시작하도록 허용해야한다.(onResume)
- 메모리 부족 또는 화면 회전할 경우, 액티비티의 일시적 종료로 인해 데이터가 소멸되는 문제
- 액티비티의 화면 회전 또는 시스템의 메모리 부족으로 인해 액티비티를 소멸 시킬 경우, 실제 액티비티 인스턴스는 사라지더라도 시스템에 존재했던 정보는 남아 있다.
- 소멸 당시 액티비의 상태를 데이터 세트(Bundle)에 저장하고, 다시 Activity로 돌아가려도 시도할 때 데이터 세트(Bundle)을 사용하여 해당 액티비티의 상태를 불러오게 된다.
퀴즈
'Main Activity'에서 'DetatilActivity'를 호출 했을 때 LifeCycle이 호출 되는 순서는?
- [MainActivity] onPause()
- [DetailActivity] onCreate()
- [DetailActivity] onStart()
- [DetailActivity] onResume()
- [MainActivity] onStop()
'Detail Activity' 종료 후 다시 'Main Activity'가 보여질 때 LifeCycle이 호출되는 순서는?
- [DetailActivity] onPause()
- [MainActivity] onRestart()
- [MainActivity] onStart()
- [MainActivity] onResume()
- [DetatilActivity] onStop()
- [DetailActivity] onDestroy()
화면회전 시 LifeCycle 호출 순서는?
onPause() -> onStop() -> (onSaveInstanceSate()) -> onDestroy() -> onCreate() -> onStart() -> (onRetoreInstanceState()) onResume()
'홈'키를 눌러 앱을 나갔다가 돌아올 때 LifeCycle 호출 순서는?
onPause() -> onStop() -> onRestart() -> onStart() -> onResume()
'Android > Android 기초' 카테고리의 다른 글
[Android] 안드로이드 4대 컴포넌트(2) - 서비스(Service) (0) | 2023.09.03 |
---|---|
[Android] 화면 회전시 액티비티(Activity)에서 데이터는 어떻게 저장해야할까? (0) | 2023.09.01 |
[Android] 안드로이드 구조와 동작 원리(2) - 구성 요소 및 빌드 과정 (0) | 2023.08.29 |
[Android] 안드로이드 구조와 동작원리 (1) - Android 플랫폼은 어떻게 생겼나? (0) | 2023.08.29 |
[Android] 패키지 명으로 외부 앱 실행 안됨 해결 / 안드로이드 11 이상 타켓 시 Manifest 추가 (0) | 2023.08.28 |