3. 액티비티 상태 변경 처리

Jacob Kwak·2022년 4월 14일
0

Android

목록 보기
2/3

구성 변경 발생

구성 변경을 유발할 수 있는 여러 이벤트가 있다.

대표적으로

  1. 세로 / 가로 모드 간 방향 변경.
  2. 언어 또는 입력 기기 변경.

구성 변경 발생 -> 액티비티 제거 및 재생성.

기존 액티비티 인스턴스
onPause(), onStop() 및 onDestroy() 콜백이 발생.

새로운 액티비티 인스턴스
생성 및 onCreate(), onStart() 및 onResume() 콜백이 발생.

ViewModel, onSaveInstanceState() 메소드 , 영구 로컬 저장소의 조합을 활용하면
구성 변경 전체에 걸쳐 액티비티의 UI 상태를 유지할 수 있다.

이러한 옵션 조합시 고려사항
1. UI 데이터의 복잡성
2. 앱 사용 사례 및 메모리 사용량 대비 검색속도

멀티 윈도우 처리 사례

[멀티 윈도우 프로세스]
멀티 윈도우 모드로 전환
-> 시스템이 현재 실행중인 액티비티에 구성 변경을 알림
-> 위의 수명 주기 전환을 거침

*이미 멀티 윈도우 모드에 있는 앱의 크기가 조정될 때도 이 동작이 발생!

액티비티는 구성 변경을 직접 처리하거나
시스템이 액티비티를 제거하고 새 측정기준으로 액티비트를 재생성하도록 허용할 수 있다.

멀티 윈도우 모드에서는 유저에게 표시되는 앱이 두 개 있더라도
유저와 "상호작용하고 있는 앱만" 포그라운드에 있으며 포커스를 가짐.

해당 익티비티는 onRestart() 상태이지만 다른 창의 앱은 onPause() 상태이다.

유저가 앱 A 에서 앱 B로 전환할 때
앱 A -> onPause()
앱 B -> onResume()

유저가 앱을 전환할 때마다 두 메소드가 전환됨.

액티비티나 대화상자가 포그라운드로 나옴

새 액티비티나 대화 상자가 포그라운드로 나올 때

1) 기존 액티비티를 "부분적으로" 가리는 경우
포커스를 잃고 'onPause()'로 전환
가려진 액티비티가 포그라운드로 돌아오면
포커스를 다시 얻고 onResume()상태

2) 기존 액티비티를 "완전히" 가리는 경우
포커스를 잃고 'onPause()' 상태로 전환과 동시 onStop()까지 이어짐.

2-1)가려진 액티비티의 동일한 인스턴스가 포그라운드로 다시 돌아오면
onRestart(), onStart(), onResume()을 호출.

2-2)인스턴스가 백그라운드로 전환된 가려진 액티비티의 새 인스턴스이면
onRestart()를 호출하지 않고 onStart(),onResume()만 호출한다.

참고 : 유저가 최근 사용 또는 홈 버튼을 탭하면 시스템은 현재 액티비티가 완전히 가려진 것처럼 동작.

유저가 뒤로 가기 버튼을 누름.

액티비티가 포그라운드에 있을 때 유저가 뒤로 가기 버튼을 누르면

액티비티는 onPause(), onStop, onDestory() 콜백을 거친다.
이 프로세스를 통해 액티비티는 제거될 뿐만 아니라 백 스택에서도 삭제된다.

기본적으로 onSaveInstanceState() 콜백이 실행되지 않는다.

그 이유는 이 동작은 유저가 액티비티의 동일한 인스턴스로 돌아올 것으로 예상하지 않고
뒤로 가기 버튼을 눌렀다는 가정을 기반으로 하기 때문.

그러나 onBackPressed() 메소드를 재정의하면
'confirm-quit' 대화 상자와 같은 일부 맞춤 동작을 구현할 수 있다.

onBackPressed() 매소드를 재정의할 때는 재정의한 메소드에서 super.onBackPressed()를 호출하는 것이 좋다.
호출하지 않는다면 뒤로 가기 버튼 동작이 유저한테 부자연스럽게 보일 수 있다.

시스템이 앱 프로세스를 종료

앱이 백그라운데 있는데 시스템이 포그라운드 앱을 위해 추가 메모리를 확보해야하면
시스템은 이를 위해 백그라운드 앱을 종료 할 수 있다.

profile
안드로이드 개발을 했었고 현재 대학교 블록체인 학회를 설립 및 운영하고 있습니다.

0개의 댓글