1. Activity 생명주기
- 앱의 완성도와 안정성을 높이기 위해 반드시 알아야 함
- 다른 앱으로 전환 시, 비정상 종료 되는 문제
- 사용자가 앱을 사용하지 않는데, 시스템 리소스가 소비되는 문제
- 사용자가 앱을 나갔다가 돌아왔을 때, 진행상태가 저장되지 않는 문제
- 화면이 가로 ↔ 세로 전환 될 때, 비정상 종료되거나, 진행상태가 저장되지 않는 문제
- 콜백
- onCreate
- 필수적으로 구현해야함
- Activity의 생명주기 중 한 번만 발생해야 하는 로직을 실행
- 멤버 변수 정의
- UI 구성 (setContentView, xml 레이아웃 파일 정의)
- saveInstanceState 매개 변수 수신 → Activity 이전 저장 상태가 포함된 Bundle 객체
- onStart
- Activity가 사용자에게 표시
- 앱은 Activity를 포그라운드로 보내 상호작용할 수 있도록 준비
- onResume
- Activity가 포그라운드에 표시되어, 사용자와 상호 작용 할 수 있는 상태
- 앱에서 포커스가 떠날 때 까지 onResume 상태에 머무름
- onPause
- 사용자가 활동을 떠나는 첫 번째 신호
- 매우 짧음
- 활동이 포그라운드에 있지 않지만, 잠시 후 다시 시작할 작업을 일시중지 하거나 조정
- ex) 반투명 Activity가 띄워져 포커스는 없지만 화면에 보이는 상태
- 이 상태를 통해서, 실행중이지 않을 때 필요하지 않은 리소스를 해지할 수 있음
- 이 상태에서, 데이터를 저장하거나, 네트워크 호출, DB의 IO 작업을 하면 안됨
- 매우 짧은 시간이라 메서드가 끝나기 전에 Activity가 종료될 수 있음
- onStop
- Activity가 사용자에게 더 이상 표시되지 않는 상태
- CPU를 비교적 많이 소모하는 종료 작업을 실행해야함
- DB 저장
- Activity가 중단되면, Android OS에서 리소스 관리를 위해 해당 Activity가 포함된 프로세스를 소멸시킬 수 있음
- onDestroy
- Activity가 완전히 종료되기 전에 실행
- 호출되는 케이스
- finish()가 호출되어 Activity가 종료될 때
- Configuration Change(ex. 기기 회전, 멀티 윈도우)로 인해, 시스템이 Activity를 일시적으로 소멸시킬 때
- onCreate
2. Fragment 생명주기
Fragment는 Activity와 별개로 자체 생명 주기를 가지고 있지만, Activity의 생명주기와 유기적으로 연관되어 있습니다.
- onAttach()
- Fragment가 FragmentManager에 추가됨
- Fragment가 호스트 액티비티에 연결될 때 호출됨
- onCreate()
- Fragment가 액티비티로부터 호출을 받아 생성됨
- Bundle로 액티비티로부터 데이터가 넘어옴
- onCreateView()
- Layout을 inflate하는 작업을 수행함
- SavedInstanceState로 이전 상태에 대한 데이터가 제공됨
- onViewCreated()
- onCreateView()를 통해 반환된 View 객체는 onViewCreated()의 파라미터로 전달됨
- 이 때, View Lifecycle이 INITIALIZED 상태로 업데이트가 됨
- View의 초기값 설정, LiveData 옵저빙, RecyclerView, ViewPager2에 사용될 Adapter 설정
- onViewStateRestored()
- 저장해둔 모든 state 값이 Fragment의 View의 계층 구조에 복원되었을 때 호출됨
- ex) 체크박스 위젯이 현재 체크되어 있는가?
- View Lifecycle : INITIALIZED → CREATED 변경
- onStart()
- 사용자에게 보여질 수 있을 때 호출됨
- Activity의 onStart()와 유사함
- Fragment의 ChildFragmentManager을 통해 FragmentTransaction을 안전하게 수행할 수 있음
- View Lifecycle : CREATED → STARTED 변경
- onResume()
- 사용자와 Fragment가 상호작용 할 수 있는 상태일 때 호출됨
- onPause()
- 사용자가 Fragment를 떠나기 시작했지만 Fragment는 여전히 visible 일 때 호출됨
- 이 때, Fragment와 View의 Lifecycle은 PAUSED가 아닌 STARTED가 됨
- onStop()
- Fragment가 더 이상 화면에 보여지지 않게 되면 호출됨
- View Lifecycle : STARTED → CREATED 변경
- onStop()이 onSaveInstanceState() 함수보다 먼저 호출됨으로써 onStop()이 FragmentTransaction을 안전하게 수행할 수 있는 마지막 지점이 됨
- onDestoryView()
- 모든 Exit Animation, Transaction이 완료되고 Fragment가 화면으로부터 벗어났을 경우 호출됨
- View Lifecycle : CREATED → DESTROYED 변경
- 가비지 컬렉터에 의해 수거될 수 있도록 Fragment View에 대한 모든 참조가 제거되어야 함
- onDestory()
- Fragment가 제거되거나, FragmentManager가 destroy 됐을 경우 호출됨
- Fragment Lifecycle의 끝을 알림
- onDetach()
- Fragment가 액티비티로부터 해제되어질 때 호출됨
3. View 그리기
- 전위순회 방식을 쓰기 때문에 부모 뷰부터 자식 뷰 순서로 그려지게 됨
- measure
- 뷰의 크기를 계산
- 모든 뷰는 각각 자신의 width, height를 계산
- measure 과정에서, 부모 - 자식 뷰간의 크기 정보 전달을 위해 2가지 클래스 사용
- ViewGroup.LayoutParams : 자식 뷰가 부모 뷰에게 자신이 어떻게 측정되고 위치를 정할지 요청 할 때 사용
- DP, PX, ... : 자식 뷰가 원하는 사이즈
- MATCH_PARENT : 부모 뷰 사이즈와 똑같이 자식뷰 사이즈 지정
- WRAP_CONTENT : 부모 뷰 안에서 content를 표현할 수 있는 fit 한 사이즈 지정
- ViewGroup.MeasureSpecs : 부모 뷰가 자식 뷰에게 요구사항을 전달할 때 사용
- UNSPECIFIED : 부모 뷰는 자식 뷰가 원하는 사이즈로 결정
- EXACTLY : 부모 뷰가 자식 뷰의 사이즈를 정확히 지정할 때
- AT_MOST : 부모 뷰가 자식 뷰의 최대 사이즈를 지정할 때
- ViewGroup.LayoutParams : 자식 뷰가 부모 뷰에게 자신이 어떻게 측정되고 위치를 정할지 요청 할 때 사용
- layout
- 뷰의 크기와 위치를 할당
- 부모 기준의 상대적 위치(left, top, right, bottom)를 계산
- draw
- 뷰를 그리는 단계
- Canvas : 뷰의 모양을 그리는 객체
- Paint : 뷰의 색상을 칠하는 객체
- measure, layout에서 측정한 크기와, 계산한 위치에 뷰를 그림
- 이 콜백은 언제든 다시 호출 될 수 있음
- scroll이나 swipe를 하게 되면 뷰는 onDraw() 다시 호출
- 객체 할당과 같이 리소스가 많이 소모되는 로직은 추가하지 말 것
- 뷰를 그리는 단계
- ViewUpdate : 런타임에 뷰를 다시 그리게 하는 함수
- invalidate : 뷰에 변화가 생겨서 다시 그려야 할 때
- color 변화 등
- requestLayout : 뷰를 처음부터 그려야 할 때
- 크기가 변화해서 measure부터 다시 해야할 때
- invalidate : 뷰에 변화가 생겨서 다시 그려야 할 때
728x90
반응형
'안드로이드 > 개념' 카테고리의 다른 글
[Android] Serializable vs Parcelable (0) | 2023.07.21 |
---|---|
[Android] Timer와 Thread (0) | 2023.07.18 |
[Android] 명시적 인텐트와 암시적 인텐트 (0) | 2023.07.16 |
[Android] Activity 상태 변경 처리 (0) | 2023.07.16 |
[Android] Kotlin의 이해 (0) | 2023.07.15 |