앱 구성요소 4가지
Activity, Service, BoardcastReceiver, ContentProvider
Activity
- 앱과 사용자간 상호작용을 위한 진입점
- 모든앱에 1개 이상 반드시 존재
- 사용자와 상호작용을 위한 UI가 존재
Lifecycle이 있음
Activity의 Lifecycle
onCreate()
- 필수적으로 구현
- Activity의 생명주기 중 한번만 발생해야하는 로직을 실행
- 멤버 변수 정의
- UI 구성 (
setContentView, xml 레이아웃 파일 정의)
saveInstanceState 매개 변수 수신 -> Activity 이전 저장 상태가 포함된 Bundle 객체
onStart()
- Activity가 사용자에게 표시
- 앱은 Activity를 포그라운드로 보내 상호작용할 수 있도록 준비
onResume()
- Activity가 포그라운드에 표시되어, 사용자와 상호 작용 할 수 있는 상태
- 앱에서 포커스가 떠날 때까지 onResume 상태에 머무름
onPause()
- 사용자가 Activity를 떠나는 첫 번째 신호
- 매우 짧음
- Activity가 포그라운드에 있지 않지만 잠시 후 다시 시작할 작업을 일시 중지 하거나 조정
- 반투명 Activity가 띄워져 포커스는 없지만 화면에는 보이는 상태
- 이 상태를 통해, 실행중이지 않을 때 필요하지 않은 리소스를 해지할 수 있음
- 이 상태에서, 데이터를 저장하거나 네트워크 호출, DB의 IO 작업을 하면 안됨
- 매우 짧은 시간이라 메서드가 끝나기전에 Activity가 종료될 수 있음
onStop()
- Activity가 더 이상 사용자에게 표시 되지 않는 상태
- 사용중, 홈 버튼을 통해 홈으로 이동해 백스택에 올라간 경우
- CPU를 비교적 많이 소모하는 작업을 종료해야함
- Activity가 중단되면 Android OS에서 리소스 관리를 위해 해당 Activity가 포함된 프로세스를 소멸시킬 수 있음
onDestroy()
- Activity가 완전히 종료되기 전에 실행
finish() 호출로 Activity가 종료될 때
configurationChage(기기 회전, 멀티 윈도우)로 인해 시스템이 Activity를 일시적으로 소멸 시킬 때
View가 그려지는 과정
부모부터 자식뷰 순서로 그려지게됨
measure
- 뷰의 크기를 계산
- 모든 뷰는 각각 자신의 width, height를 계산
- measure 과정에서, 부모 - 자식 뷰간의 크기 정보 전달을 위해 2가지 클래스 사용
ViewGroup.LayoutParams : 자식 뷰가 부모 뷰에게 자신이 어떻게 측정되고 위치를 정할지 요청할 때 사용
DP, PX : 자식뷰가 원하는 사이즈
MATCH_PARENT : 부모 뷰 사이즈와 똑같이 자식 뷰 사이즈 지정
WRAP_CONTENT : 부모 뷰 안에서, content를 표현할 수 있는 fit한 사이즈 지정
ViewGroup.MeasureSpecs : 부모 뷰가 자식 뷰에게 요구사항을 전달할 때 사용
UNSPECIFIED : 부모 뷰는 자식 뷰가 원하는 사이즈로 결정
EXACTLY : 부모 뷰는 자식 뷰의 사이즈를 정확히 지정할 때
AT_MOST : 부모 뷰가 자식 뷰의 최대 사이즈를 지정할 때
layout
- 뷰의 크기와 위치 할당
- 부모기준의 상대적 위치 (
left, top, right, bottom)을 계산
draw
- View를 그리는 단계
Canvas : 뷰의 모양을 그리는 객체
Paint : 뷰의 색상을 칠하는 객체
measure에서 측정한 크기로 layout에서 계산한 위치에 뷰를 그림
- 이 콜백은 언제든 다시 호출될 수 있음
scroll, swipe등 동작하면 View는 onDraw를 다시 호출
- 객체 할당같이 리소스가 많이 드는 로직은 추가하지 말것
viewUpdate
런타임에 뷰를 다시 그리게 하는 함수
invalidate : view에 변화가 생겨서 다시 그려야 할 경우 호출
requestLayout : view를 처음부터 그려야 할 때
- 크기가 변화해서
measure부터 다시 해야할 때
Service
- 백그라운드에서 오래 실행되는 작업 수행을 위한 컴포넌트
- 사용자가 다른 앱으로 전환하더라도 백그라운드에서 계속 실행
- UI가 없음
Foreground Service
- 사용자에게 잘 보이는 작업
- 반드시 알림을 표시해야하며, 사용자가 앱과 상호작용하지 않을 때도 계속 실행됨
Background Service
- 사용자에게 직접 보이지 않는 작업
- 앱이 API 26 이상을 대상으로 할 경우
- 즉시 실행 :
Work Manager
- 지연 작업 :
Alarm Manager
Bind Service
- 바인딩된 서비스는 클라이언트-서버 인터페이스를 제공해 서비스와 상호 작용함
- 여러개가 한번에 바인딩 될 수 있고, 바인딩 된 컴포넌트가 모두 종료되면 서비스도 종료됨
BroadcastReceiver
- Android OS에서 발생하는 이벤트와 정보를 앱에서 수신할 수 있도록 하는 컴포넌트
- UI 없음
ContentProvider
- 파일 시스템, SQLite 데이터베이스, 웹상이나 앱이 엑세스할 수 있는 다른 모든 영구 저장위치에 저장 가능한 앱 데이터의 공유형 집합 관리
- 다른 앱은
ContentProvider를 통해 해당 데이터를 질의하거나 수정할 수 있음
Manifest
앱의 필수적인 정보를 담고 있는 파일
Intent
- 컴포넌트간 통신을 할 수 있게 하는 역할
- 앱에 포함된 컴포넌트 이외에, 다른 앱의 컴포넌트와도 통신할 수 있음
- 명시적 인텐트 : 특정 컴포넌트, 액티비티를 명확히 특정해 실행
A Activity에서 B Activity 실행 호출
- 암시적 인텐트 : 동작을 특정하긴 했지만, 실행될 대상이 달라질 수 있는 경우
- 특정 URL을 실행이라는 액션을 요청한 경우, 웹 브라우저 기능을 가진 다수의 앱이 호출될 수 있음