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 |