각각의 컴포넌트는 독립적인 형태로 존재하며, 고유한 기능을 수행하고 Intent 를 통해서 상호작용한다.
Intent란❓
- 컴포넌트 A가 컴포넌트 B를 호출할 때 필요한 정보들을 담고 메세지 객체
- 전달하는 수단으로서의 객체 (상태/값 등을 저장하기 위한 객체는 Bundle)
명시적 인텐트
- 호출할 대상을 지정하여 사용
val myIntent = Intent(mContext, MainActivity::class.java)
val myIntent = Intent(mContext, MyService::class.java)
암시적 인텐트
- 컴포넌트외의 속성들로 구성하여 속성에 부합하는 컴포넌트 실행
//전화걸기를 요청하는 소스
val intent = Intetn("android.intent.action.CALL", Uri.parse(tel))
Activity
- 앱의 UI 화면을 담당하는 컴포넌트
- 하나 이상의 View 또는 ViewGroup 이 있어야함(예를들어 버튼, 이미지 등등)
Service
- 화면에 존재하지 않고 백그라운드에서 실행되는 컴포넌트
- Application이 종료되어도 동작
포그라운드(Foreground) 서비스
사용자가 눈에띄는 작업을 수행해야하는 경우에 사용
예를들어 피트니스앱(permission 필요), 파일다운로드, 오디오 플레이어 앱
앱과 상호작용 하지 않는 경우에도 계속 실행
Notification 을 통해 status 표시 가능
백그라운드(Background) 서비스
사용자가 직접 보이지 않는 작업을 수행
예를들어 게임 업데이트 중에 해당앱에서 나가도 업데이트는 계속 진행되는것
=> 현재 백그라운드에대한 많은 제한들이 있다
참고 : https://developer.android.com/about/versions/oreo/background
바운드(Bound) 서비스
클라이언트-서버 인터페이스를 제공하여 구성 요소가 서비스와 상호작용
여러 프로세스에 걸쳐 프로세스 간 통신(IPC)으로 수행
바인딩이 해제되면 해당 서비스는 소멸
Servie 생명주기
여기서 startService() 는 Foreground 와 Backgound 이고 bindService() 는 Bound 이다
BroadcastReceiver
- 단말기에서 발생하는 다양한 이벤트, 정보를 받고 반응하는 컴포넌트
- 예를 들어 배터리부족, 충전, 문자 수신, 전화수신
정적 리시버
- 매니페스트에 등록하여 리시버를 구현하는 형태인데 한 번 등록하면 해제할 수 없는 방식
🛑 단, API 레벨이 26 이상이면 제한이 면제되는 몇가지 빼고는 사용할수 없다..⁉ (홀리..)
대신에 scheduled jobs 를 사용해야한다고 한다!! (리얼리..?!)
참고 :
동적 리시버
- 클래스 파일에서 리시버를 등록, 해제할 수 있는 형태이기 때문에 앱에 부하가 적음
- 다른 컴포넌트에 귀속되기 때문에 다른 컴포넌트의 생명주기가 끝나면 동작하지 않음
- 해제를 적절히 해주지 않는다면 메모리 릭이 발생
🛑 리시버에는 너무 많은 작업, 시간이 오래걸리는 작업을 하면 안된다. 처리 지연시간이 길어진 경우 ANR이 발생하기 떄문에 리시버에는 간단한 일을 처리하도록 하고, 스레드를 별도로 생성해서 처리하도록 해야한다
Content Provider
- 데이터를 저장하고, 가져오고, 모든 App에서 접근할 수 있도록 하는 컴포넌트
- 앱에서 갤러리에 접근하거나 사진파일을 가저오거나 할때 이용함
- 권한이 필요함
'개발 > Android' 카테고리의 다른 글
[Android] Layout 종류 (0) | 2022.07.31 |
---|---|
[Android] Retrofit2 와 OkHttp (0) | 2022.07.30 |
[Android] Handler? Looper? Runnable? (0) | 2022.07.28 |
[Android] Room 사용기 (0) | 2022.07.28 |
[Android] Context란? (0) | 2022.07.27 |
댓글