본문 바로가기
Android Q&A/Android One a day

[안드로이드 면접] - 5:

by Jman 2023. 1. 28.

1. Activity 클래스의 onSaveInstanceState(), onRestoreInstanceState() 메소드의 역할은 무엇인가?

onSaveInstanceState()

더보기

해당 메소드는 Activity 가 onPause 되기 전에 데이터를 저장하게 된다.

onRestoreInstanceState()

더보기

Activity 가 파괴되고 다시 재생성될 때, Activity 가 가지고 있는 Bundle 로부터 데이터를 회복할 수 있다.

또한 onCreate() 와 onRestoreInstanceState() 콜백 메서드는 같은 번들 객체를 전달 받는다.

그래서 보통은 데이터를 회복하는 코드를 onRestoreInstanceState() 에 많이 작성하는 편이다.

onCreate() 에서 savedInstance 를 받아 처리하는 경우, 처음 실행이 되는지 재생성되는 것인지 판단하기 위해서 데이터의 null check 가 필요하다.

 

2. Activity 가 종료되는 경우가 어떤 경우가 있을까?

더보기
  • 사용자가 '뒤로가기(Back)' 버튼을 눌렀을 때
  • Activity 가 백그라운드에 있을 때 시스템 메모리가 부족해진 경우(OS 가 강제 종료)
  • 언어 설정을 변경할 때
  • 화면을 가로/세로 회전할 때
  • 폰트 크기나 폰트를 변경했을 때
  • finish() 메소드 호출

 

💡 Activity 화면 회전 시 라이프 사이클

onPause() > onStop() > onSaveInstanceState() > onDestroy() > onCreate() > onStart > onRestoreInstanceState() > onResume()

💡 Fragment 화면 회전 시 라이프 사이플

onPause() >  onStop() > onSaveInstanceState() > onDestroyView() > onDestroy() > onDetach() > onAttach() > onCrate() > onCreateView() > onActivityCreated() > onStart() > onRestoreInstanceState() > onResume() 

[단, API 29 이전은 onStop 이전에 onSaveInstanceState() 가 실행된다.]

 

3. 화면 회전 시 데이터 초기화 되는 이슈를 어떻게 해결할 수 있을까?

더보기

두 가지 방법이 존재한다. ViewModel 에서 데이터를 관리하는 방법과 onSaveInstanceState 를 이용하여 저장하는 방식이 있다.

뷰모델은 액티비티가 파괴되어도 파괴되지 않는다. 그래서 뷰모델에서 데이터를 관리하면 액티비티가 재생성을 하더라도 뷰모델에 있는 데이터를 다시 연결해서 사용해주면 된다.

onSaveInstanceState 는 번들에 key-value 로 데이터를 저장하여 사용한다.

 

4. Activity VS Fragment 차이는?

더보기
  • Activity : 앱과 사용자의 상호작용을 위한 진입점(EntryPoint) 역할과 동시에 하나의 UI 화면을 그리는 컨테이너 역할을 수행한다.
  • Fragment : 독립적으로 존재할 수 없고, 반드시 Activity 또는 다른 Fragment 에 정의되어야 한다. 다양한 UI 모듈화하여 재사용하고 화면 구성을 더욱 쉽게할 수 있도록 도와준다.

 

유연한 UI/UX 구현

Fragment 는 기본적으로 태블릿과 같은 큰 화면에서 역동적이고 유연한 UI 디자인을 지원하는 것이 목적이었다.

재사용성증가

뷰 또는 비즈니스 로직을 Fragment 단위로 분리할 수 있고, 아키텍처 원칙에서 가장 중요한 관심사 분리를 통해 의존성을 분리하고 독립성을 키울 수 있다. 이 부분을 잘 활용하면 Fragment 를 재사용할 수 있다. [ex DialogFragment]

퍼포먼스 관점

Activity 는 상대적으로 Fragment 보다 일단 무겁다. 또한, Fragment 는 상대적으로 가볍게 추가/제거가 가능하다. 그렇기 때문에 Activity Stack 에 Activity 를 쌓기보단 Fragment BackStack 에서 Fragment 를 관리하는 것이 메모리 관리면에서 효율적이고 화면 전환도 Activity 보다 순조롭다.

데이터 공유

Activity 간 데이터 공유는 일반적으로 Intent 를 사용한다. Activity 는 다른 프로세스에서 실행하는 것을 염두하고 설계 되었기 때문에 메모리 영역을 공유하지 않는다.

그렇기 때문에 리눅스 커널 레벨에서 프로세스 간 IPC 통신을 하게 된다.

이 부분에서 많은 제약사항이 생기며 메모리를 직접 공유하는 것보다 퍼포먼스 측면에서 많이 떨어진다.

하지만,

Fragment 는 데이터 간 공유는 Fragment 의 상위 Activity 내에서 자유롭게 이루어진다.

 

5. 왜 Activity 클래스의 onCreate() 메소드 안에서 setConentView() 를 사용할까?

더보기

Activity 의 onCreate() 함수는 처음 실행될 때 가장 먼저 호출되고 한 번만 호출되는 함수이다.

onResume() 또는 onStart() 와 같이 여러 번 호출될 수 있는 곳에서 호출하는 것은 매우 비효율적이다.

 

6. setContentView 와 LayoutInflater.inflate 의 차이는?

더보기

둘 다 xml 을 inflate(전개) 하고 view 를 연결하는데 사용된다.

 

setContentView 는 Inflate 를 알아서 내부적으로 수행한다.

하지만 Fragment 는 Inflate 를 직접해주어야 한다. 그래서 LayoutInflate.inflate 로 inflate 작업을 수행한다.

 

 

 

 

 

 

 

'Android Q&A > Android One a day' 카테고리의 다른 글

[안드로이드 면접] - 7 :  (0) 2023.01.30
[안드로이드 면접] - 6 :  (0) 2023.01.29
[안드로이드 면접] - 4 :  (0) 2023.01.27
[안드로이드 면접] - 3 :  (0) 2023.01.26
[안드로이드 면접] - 2 :  (0) 2023.01.25