안드로이드 4대 컴포넌트 !
Activity, Service, Content Provider, Broadcast Receiver
Intent
컴포넌트간에 통신을 위해 주고 받는 메시지 또는 데이터 덩어리
패키지 매니저 : 앱을 설치하고 삭제하며, 설치된 모든 패키지 정보를 수집한다.
수집된 정보는 원하는 앱에게 제공할 수 있다. 모든 패키지 정보는 각 패키지마다 존재하는 AndroidManifest.xml파일 내용을 기반으로 설치 시점에 수집된다.
액티비티 매니저 : 안드로이드 4대 컴포넌트들을 관리하며, 그중 액티버티를 실행하는 기능도 가진다.
안드로이드에서는 하나의 패키지가 실행되면 하나의 프로세스가 생성된다.
INTENT를 다른 패키지로 보내려하는데 프로세스들은 서로의 메모리를 절대 참조 할 수 없다.(공유불가!)
다른 프로세스의 정보를 획득하기 위해서는?
IPC(Inter Process Communication)공유 메모리 사용! -> 안드로이드에서는 IPC를 위한 Binder제공.
Binder? 안드로이드에서 지원하는 IPC 프로토콜(공유메모리같은거..)
IPC는 메모리에 직렬화가 기반되어야함!
A패키지프로세스에서 B패키지프로세스로 데이터 전송시 하나씩 전송하는것이 아니라 직렬화를 통해 데이터를 한번에 전송한다.
직렬화? 여러 데이터를 메모리에 직렬로 할당하는 동작
직렬화 객체 인텐트
1. Primitive 타입 (순수 자료형)
순수 자료형은 각각 메모리에 분리되어 할당되지 않는다. (ex int형은 4바이트 연속된 메모리에 할당)
Primitive타입의 객체는 그 자체가 직렬화 객체이며, 별도의 처리를 하지 않고 다른 프로세스에 전달이 가능하다
프리미티브 타입은 변수 자체를 전달하는 경우는 드물다.
거의 클래스 내에 정읳고 객체화한다
-> 문제점 : 클래스를 객체화하면 내부의 프리미티브 타입 변수들이 서로 연속된 메모리에 할당되지 않아 직렬화 객체가 될수 없다! ==> 클래스 자체를 직렬화 한다 ==> Serializable인터페이스 사용
2. Serializable 인터페이스
- Serializable인터페이스 상속받으면 클래스의 멤버변수들이 직렬화된다.
- 마커 인터페이스 (내용이 없는 인터페이스)
--> 클래스를 객체화할 때 내부 변수들을 직렬화 해야 한다고 알려주는 용도이다.
--> 직렬화 객체야~! 라고 알려주기만 하는 용도
- 프로세스 간 통신 뿐아니라 파일에 쓰거나, 네트워크를 이용해 다른 단말기나 서버로 전송할 때 활용되기도 한다.
- 송수신 앱에 모두 같은 클래스 파일을 갖고 있어야한다.
3. Parcel
- Parcel 클래스는 안드로이드에서 IPC전용 데이터로 사용하기 위해 만들어진 클래스다.
- 따라서 프로세스 간 데이터 전달에 최적화되어있어서 속도가 매우 빠르다.
- 안드로이드는 굳이 Parcel객체를 사용하지 않아도 내부적으로 전송되는 데이터들을 Parcel객체로 변환하여 전송한다. 다만, 직접 Parcel객체를 사용하면 변환 과정을 거치지 않아서 성능이 좀 더 좋다.
- 주의 사항 : Parcel객체는 데이터를 쓴 순서와 읽는 순서가 일치 해야한다.
- Parcel 객체를 사용할때 이러한 순서를 유지하는 것은 너무 불편함 ㅠㅠ
--> Parcel 단독으로 사용되지 않고, Parcelable을 통한다.
4. Parcelable 인터페이스
- 일종의 Parcel 데이터를 사용하는 설명서와도 같다.
왜냐하면 Parcelable를 상속받은 클래스 내부에 Parcel 데이터를 읽고 쓰는 함수들을 구현하기 때문이다.
- Serializable과 유사하지만, Serializable은 상속만 받으면 직렬화 클래스가 되지만, Parcelable은 읽고 쓰는 함수를 구현해야한다.
- 송수신 앱에 모두 같은 클래스 파일을 갖고 있어야한다.
- 안드로이드는 프로세스간 통신이 필요한 클래스는 대부분 이 클래스 상속받아 구현한다.
- 간단한 프리미티브 타입 변수를 전달하는 경우 불편(parcelable클래스구현...파일배포...수정되면..송신도수정..)
--> Bundle클래스
5. Bundle 클래스
- Parcelable클래스를 상속 받아 구현된 클래스
- 안드로이드 SDK 라이브러리에 포함되어 있기 때문에 클래스 파일 자체를 배포할 필요가 없다.
- Bundle은 모든 타입의 직렬화 객체를 담을 수 있고, Parcel와 달리 순서가 상관없다
- Bundle은 자바 컬렉션 프레임워크 Map과 같은 형식으로 데이터 읽고 씀(키와 값)
->실제로 Bundle내부에는 Map사용한다.
6. Intent
- Parcelable클래스 상속받아 구현된 클래스
- Bundle을 포함한 여러개의 직렬화 객체를 포함 시킬수 있다. (내부에 Bundle객체가 있음)
- 인텐트는 단지 직렬화된 데이터 덩어리다.
그러나 앱과 액티비티 매니저, 패키지매니저 등의 시스템 서비스 간에 약속된 의미있는 정보를 채워 넣으면 인텐트라는 것이 된다!
- 인텐트에 의미를 부여하는 여섯가지 정보
1) 컴포넌트 정보 : 명시적으로 원하는 컴포넌트(액티비티,서비스,리시버)를 실행하기 위한 용도
2) 액션 3) 카테고리 4) 데이터 위치와 타입 : 암시적으로 원하는 컴포넌트 실행하기 위한 용도
5) 엑스트라 : 각종 컴포넌트에 순수 데이터를 전달하기 위한 용도
6) 프래그 : 각종 컴포넌트를 제어하기 위한 플래그
인텐트의 주 목적!
특정 컴포넌트를 실행 정보를 넣어서 해당 컴포넌트를 실행하고, 실행되는 컴포넌트에 원하는 데이터를 전달한다!