안드로이드 액티비티
안드로이드 앱은 액티비티라는 컴포넌트가 하나 이상 결합되어 생성된다. 액티비티는 앱의 기능을 갖는 단일의 독립 실행형 모듈이다. (리눅스의 프로세스로 실행됨)
- 하나의 사용자 인터페이스 화면 및 그 기능과 밀접하게 연관된다.
- 재사용과 교체 가능한 구성요소로 만들어져서 서로 다른 앱에서 공유할 수 있다. (새로운 이메일 액티비티를 작성하지 않고 기존 이메일 앱의 액티비티를 이용할 수 있음)
- 안드로이드 Activity 클래스의 서브 클래스로 생성되어야 하며, 앱의 다른 액티비티와 완전히 독립적으로 구현 되어야 함
- 액티비티는 다른 액티비티의 함수를 직접 호출할 수 없고, 데이터도 직접 액세스 할 수 없음
(그럼 어떻게 하라고→ 인텐트와 콘텐트 제공자를 사용해서 액티비티를 공유해라)
안드로이드 프래그먼트
하나의 액티비티에서 UI의 일부를 구성하는 여러 프래그먼트를 사용하여 다수의 UI 화면을 구현할 수 있다.
이때, 액티비티 → 하나 이상의 프래그먼트를 포함하는 컨테이너 가 된다. 서로 다른 앱 화면을 나타내는 프래그먼트를 전환하여 사용하는 하나의 액티비티로 앱을 구성할 수 있음
안드로이드 인텐트
하나의 액티비티가 다른 액티비티를 론칭(시작)할 수 있는 메커니즘
액티비티가 안드로이드 런타임에 인텐트를 요청하면 해당 인텐트에 부합하는 액티비티를 안드로이드 런타임이 찾아서 시작한다. 한 액티비티가 다른 액티비티를 직접 시작하는게 아님!!! 인텐트에서는 수행될 오퍼레이션을 나타내고, 필요하면 전달할 데이터도 포함할 수 있다.
- 명시적 인텐트 : 클래스 이름으로 액티비티를 참조하여 특정 액티비티의 시작을 안드로이드 런타임에 요청함 (시작할 액티비티를 정확하게 알아야됨
- 암시적 인텐트 : 우리가 하길 원하는 작업 (액션 타입)을 안드로이드 런타임에 알려줌 → 그런 작업을 할 수 있다고 자신을 등록한 액티비티를 안드로이드 런타임이 찾아서 시작 (이를 인텐트 레졸루션이라 함) → 하나 이상 찾을 경우 액티비티를 사용자가 선택할 수 있게 함
브로드캐스트 인텐트
브로드캐스트 수신자로 등록된 모든 앱에 전송되는 시스템 차원의 인텐트
예) 안드로이드 시스템에서 장치 상태의 변화를 알려주기 위해 브로드 캐스트 인텐트를 전송한다. 장치의 전원을 켜서 시스템이 부팅될 때, 충전 커넥터를 연결할 떄, 화면을 켜거나 끌 때 등
- 일반 브로드캐스트 인텐트 : 관련 이벤트에 관심 있는 모든 브로드캐스트 수신자에 비동기 형태로 동시에 전송됨
- 순차 브로드캐스트 인텐트 : 한번에 하나의 브로드캐스트 수신자에 전송됨, 그 다음 차례의 브로드캐스트 수신자에 계속 전송되거나 또는 중단될 수 있음
브로드캐스트 수신자
브로드캐스트 인텐트에 응답할 수 있는 메커니즘
- 앱에 등록되어 있어야 함
- 관심 있는 브로드캐스트 타입을 나타내는 인텐트 필터를 사용해서 구성함
- 등록된 브로드캐스트 타입이 인텐트와 일치하면 수신자가 등록된 앱의 현재 실행 여부와 무관하게 안드로이드 런타임이 해당 수신자를 시작함 -> 수신자는 필요한 작업을 10초 이내에 수행해야 함
예) 데이터 변경이나 사용자에게 알림을 전송 - 백그라운드로 실행되며 사용자 인터페이스를 갖지 않음
안드로이드 서비스
백그라운드로 실행되는 프로세스이며, 사용자 인터페이스를 갖지 않음
- 액티비티나 브로드캐스트 수신자 또는 다른 서비스로부터 시작되고 관리될 수 있음
- 안드로이드 런타임에 의해 다른 프로세스보다 더 높은 우선순위로 실행된다.
- 웬만해서는 종료되지 않지만, 장치의 메모리 부족 등으로 시스템이 리소스를 해제하다가 어쩔 수 없는 경우에 마지막 수단으로 종료된다. 그러나 런타임이 서비스 프로세스를 죽이더라도 리소스가 다시 사용 가능하게 되면 그 즉시 자동으로 다시 시작된다.
- 서비스는 자신이 포그라운드에서 실행될 필요가 있다고 선언함으로써 중단의 위험을 줄일 수 있으며, 이때는 startForeground()을 호출한다. (서비스가 중단되면 사용자에게 해를 끼칠 수 있을 경우에만 그렇게 하는 것이 좋음)
예) 서비스로 스트리밍 되는 오디오를 사용자가 듣고 있는 경우
🐯 서비스는 언제 사용하는게 이상적일까?
어떠한 작업을 계속해서 수행할 필요는 있지만 사용자에게 보여 줄 수 있는 UI는 필요 없는 경우
비록 UI를 갖고 있지는 않지만, 서비스에서는 알림과 토스트를 사용해서 여전히 사용자에게 메시지를 알려줄 수 있다.
인텐트를 요청할 수 도 있다.
예시로는,
계속 수행되어야 하는 오디오의 스트리밍, 주식이 지정된 가격이 될 때 사용자에게 알려 줄 필요가 있는 주식 앱 등
콘텐트 제공자
앱 간에 데이터를 공유하는 메커니즘
어떤 앱도 자신의 내부 데이터 사용을 다른 앱에 제공할 수 있다. 이때 해당 데이터를 추가, 삭제, 조회하는 능력을 갖는 콘텐트 제공자를 구현한다. 그리고 데이터의 사용은 콘텐트 제공자가 정의한 URI를 통해 제공된다. 데이터는 파일 또는 SQLite 데이터베이스 형태로 공유될 수 있다.
네이티브 안드로이드 앱은 다른 앱에서 데이터(연락처나 미디어 파일 등)를 사용할 수 있는 표준 콘텐트 제공자를 많이 포함한다. 안드로이드 시스템에서 현재 사용 가능한 콘텐트 제공자는 콘텐트 리졸버를 사용해서 찾을 수 있다.
앱 매니페스트
앱을 구성하는 다양한 요소를 합치는 접착제의 역할
XML 파일이며, 앱을 구성하는 액티비티, 서비스, 브로드캐스트 수신자, 데이터 제공자, 퍼미션 등이 정의되어 있음
앱 리소스
안드로이드 앱은 앱 패키지(APK)로 빌드되어 장치에 설치 및 실행된다. 이때 APK에는 자바 실행 코드, 매니페스트 파일의 메타 데이터, 각종 리소스 파일이 포함됨, 그리고 리소스 파일에는 여러 종류의 리소스가 포함된다. (app/src/main/res 서브 디렉터리에 저장됨)
앱 컨텍스트
매니페스트 파일과 리소스가 결합되어 앱 컨텍스트가 생성된다. 컨텍스트는 안드로이드 Context 클래스로 나타내며, 런타임 시에 앱의 리소스를 사용하기 위해 앱 코드에서 사용될 수 있다. 또한, 런타임 시에 정보를 수집하고 앱의 환경을 변경하기 위해 앱의 컨텍스트에서 다양한 메서드가 호출 될 수 있다.
추후에 각 카테고리별로 공부하고 포스팅할 예정 😉
•──⋅참고 자료⋅──•
닐 스미스, [핵심만 골라 배우는 안드로이드 스튜디오 Arctic Fox & 프로그래밍], 제이펍 (2021)