-
https://developer.android.com/guide/components/fundamentals.html?hl=ko#Components
Android 시스템
안드로이드는 운영체제이다.
안드로이드는 리눅스커널을 기반으로 한다.
안드로이드 스택
- 개발 언어 : Java
안드로이드앱은 Java로 작성한다
기존의 Java api + 안드로이드 Java api
보통 자바로 작성된 프로그램은 JVM 위에서 동작하지만,
안드로이드는 DVM(달빅가상머신) 위에서 동작
JVM은 자바코드를 컴파일한 Class 파일이 실행되지만 DVM은 Dex 파일이 실행
DVM은 모바일 환경에 최적화된 가상머신
- 실행파일 : APK 파일
안드로이드 SDK 는 모든 데이터와 리소스와 코드를 컴파일하여 하나의 APK를 만든다
확장자는 .apk
안드로이드의 실행파일이다
APK : 자바실행코드(dex파일), 매니페스트 파일의 메타데이터, 각종 리소스파일이 포함됨
- 리소스 관리 : 최소 특권의 원리
안드로이드 앱은 자신이 필요한 구성요소에 대해서만 리소스를 액세스 할 수 있다.
다른앱(ex 전화, 문자, 저장소 등)의 리소스에 대해 엑세스 권한을 가지려면
manifest 설정파일에 필요한 권한을 명시적으로 부여해야한다.
앱 구성요소
안드로이드는 진입지점이 여러가지이다. ( ex) C 언어는 main()함수가 유일한 진입지점)
4가지 유형
액티비티 / 서비스 / 콘텐츠 제공자 / 브로드캐스트 수신기
각자의 생명주기를 가지며, 생성 및 소멸 방식이 있다.
액티비티
- UI가 있는 단일 화면을 구성함
- Activity 클래스나 그 서브클래스로 구현
- 각각의 액티비티는 독립적인 실행 모듈(프로세스로서 작동됨)
- java파일(제어) + xml파일(뷰) 로 구성
- 다른 액티비티의 메서드에 직접접근 불가
- 대신 Intent 클래스 와 Content Receiver 클래스를 사용해 공유가능
액티비티는 재사용될 수 있는데,
내가 만약 메일기능이 필요하면 그것을 구현할 필요없이
기존의 메일앱의 액티비티를 이용하면 된다(암시적 인텐트 이용)
액티비티 개념
서비스
백그라운드에서 실행됨
UI 요소 없음
Service 클래스로 구현
서비스 개념
콘텐츠 제공자
앱의 공유되는 부분을 관리
앱이 엑세스할 수 있는 다른 앱의 리소스를 콘텐츠 제공자를 통해 접근
ContentProvider 클래스로 구현
표준 API 집합으로 구현해야함
브로드캐스트 수신자
시스템의 브로드캐스트 알림에 대해 그것을 수신할것인지.
연결해주는 역할
ex) 화면이 꺼졌거나, 배터리가 부족하거나, 혹은 다른앱으로부터의 신호
해당신호를 브로드캐스트 수신기로 받아서 어떤 처리를 할 수 있음
BroadcastReceiver 클래스로 구현
각 브로드캐스트는 Intent 객체로 전달됨
내 앱에서 사용자의 캡처가 필요한경우?
화면캡처가 필요하다는 신호를 보내면 카메라앱들이 그것을 수신하고
반환되는 결과를 내앱에서 쓰면된다
시스템에 메세지를 전달하면 시스템이 해당 구성요소를 활성화해줌
Intent 인텐트
다른 컴포넌트에 정보를 공유하고싶을때 Intent 객체를 설정한 후 보낸다
인텐트로 활성화 : Activity, Service, Broadcast Receiver
ContentResolver로 활성화 : Content provider
액티비티,서비스,브로드캐스트 수신기는 인텐트라고 하는 비동기식 메시지를 통해 활성된다
인텐트는 각구성요소를 런타임에 바인드한다
인텐트는 Intent 객체로 생성
특정 구성요소를 활성화할지, 요소의 특정유형을 활성화할지 메시지 정의
명시적이거나 암시적 2가지
액티비티, 서비스 : 수행할 작업을 정의
브로드캐스트수신기 : 브로드캐스트될 (수신할) 알림 정의
콘텐츠제공자는 인텐트가 활성화되지 않음
ContentResolver로부터 요청이 지정되면 활성화됨
ContentResolver 객체에서 메서드 호출하여
콘텐츠확인자는 콘텐츠제공자와 모든 직접적인 트랜잭션을 처리
- 액티비티 : Intent 를 startActivity() 또는 startActivityForResult() 에 전달
- 서비스 : Intent를 startService() 에 전달 또는 bindService() 에 전달하여 서비스에 바인드
- 브로드캐스트 : Intent를 sendBroadcase() 또는 sendOrderedBroadcase() 또는 sendStickyBroadcase() 에 전달
- 콘텐츠 제공자 : ContentResolver 에서 query() 를 호출
Broadcast Receiver는 명시적으로 호출하지 않아도 적당한
인텐트 필터를 AndroidManifest.xml에 지정해놓으면 조건이 일치할때 활성화될 수 있다
액티비티가 안드로이드 런타임에 인텐트를 요청
인텐트에 부합하는 액티비티를 찾아서 실행
인텐트에 수행될 오퍼레이션과 전달할 데이터를 포함
Intent 속성
Action, Data, Category, Type, Component, Extra
명시적(explicit) 인텐트
클래스이름으로 액티비티 참조
호출할 액티비티를 런타임에 요청
해당 액티비티를 정확히 알고있어야함
지정된 컴포넌트가 실행됨
암시적(implicit) 인텐트
수행하길 원하는 작업(액션타입)을
런타임에게 알림
그 작업을 할수있다고 등록한 다른 액티비티들을 찾음
여러개 있을경우 사용자가 선택하게하고
그것을 시작시킴
Component를 제외한 속성들로 구성됨
해당 속성들에 부합하는 컴포넌트가 실행됨
AndroidManifest.xml
해당 <activity>의 <intent-filter> 하위에
속성 추가
브로드캐스트 인텐트
Broadcast Receiver로 등록된 모든 앱에 전송되는 인텐트
시스템차원의 인텐트임
시스템은 장치상태 변화를 알려주기 위해 브로드캐스트 인텐트를 전송
ex) 시스템이 부팅될때, 충전기가 연결될때
기존 인텐트와의 차이점?
지정된 컴포넌트만 받는것이 아닌
시스템 상의 여러 컴포넌트가 동시에 받음
정규(normal) 순차(ordered) 두가지
normal : 관련 이벤트에 관심있는 모든 Broadcast Receiver에게 비동기 형태로 동시 전송
ordered : 한 번에 하나의 Broadcast Receiver에게 전송하고 다음차례의 수신자에게 계속 전송하거나 중단
브로드캐스트 수신자
애플리케이션이 Broadcast Intent에 응답하는 메커니즘
개발할때 앱차원에서 관심있는 브로드캐스트 타입에 등록함
Intent Filter를 사용
타입이 일치하면 런타임이 그 수신자를 시작시킴
수신자는 필요한 작업을 5초 이내에 수행하고 복귀해야함
Broadcast Receiver는 백그라운드로 실행됨. UI 없음
서비스
백그라운드로 실행되는 프로세스
UI없음
액티비티나 브로드캐스트 수신자나 다른 서비스가 관리함
UI가 없으나 현재 화면상에 통지(notification)이나 토스트(toast)같은 메시지를 띄울 순 있음
인텐트 요청도 가능
서비스는 런타임상에서 높은 우선순위로 실행됨
장치의 메모리가 부족할때 가장 마지막으로 종료됨
만약 kill 당해도 리소스가 사용가능해지는
즉시 자동으로 다시시작
중단의 위험을 줄이려면?
포그라운드(foreground)에 실행될 필요가 있다고 선언
startForeground() 호출
스트리밍 서비스나 사용자에게 변동사항을 실시간으로 알려야하는 서비스의 경우 이 기능이 필요
콘텐츠 제공자
앱간의 데이터공유 메커니즘
내부 데이터를 다른앱에 제공하려면 콘텐츠 제공자를 구현.
Content Provider는 권한(permission)이 허용된 데이터를 관리
데이터의 액세스는 콘텐츠 제공자가 정의한 URI를 통해 제공
데이터파일 or 데이터베이스 전체의 형태로 공유
안드로이드 시스템에서 현재 사용가능한 콘텐츠를 찾으려면
Content Resolver를 사용
인텐트
manifest 매니페스트
시스템에게 앱의 구성요소를 알리기 위한 파일
액티비티, 서비스, 브로드캐스트 수신자, 콘텐츠 제공자, 퍼미션등이 정의되어있음
안드로이드 런타임이 앱 구성요소를 시작하기 위해
AndroidManifest.xml 를 읽음
개발자는 이 파일안에 모든 구성요소를 선언해야함
파일 위치 : 앱 프로젝트 루트( app/src/main/AndroidManifest.xml )
선언할 내용
- 앱의 구성요소
- 앱이 요구하는 모든 사용자 권한 식별(ex 인터넷 액세스, 연락처 액세스)
- 앱에서 요구하는 최소 API 레벨 선언
- 앱에서 필요로하는 HW 및 SW 기능 선언(ex 카메라,블루투스 서비스, 멀티터치 화면)
- 앱에 링크되어야 하는 API라이브러리 (Android 프레임워크 API 제외)
예시
<application android:icon="@drawable/app_icon.png" ... >application 엘리먼트의 android:icon 속성 :앱을 식별하는 아이콘 리소스 정의
<activity android:name="com.example.project.ExampleActivity" android:label="@string/example_label" ... >activity 엘리먼트의 android:name 속성 : Activity 클래스의 정규화된 클래스이름
android:label 속성 : Activity의 사용자에게 표시되는 레이블로 사용할 문자열
- 액티비티의 경우 <activity> 요소
- 서비스의 경우 <service> 요소
- 브로드캐스트 수신기의 경우 <receiver> 요소
- 콘텐츠 제공자의 경우 <provider> 요소
매니페스트에 선언하지 않는 콘텐츠는 실행될 수 없다.
하지만 브로드캐스트 수신자는 매니페스트 파일에 선언해도 되고
BroadcastReceiver 객체로 동적으로 생성해 시스템에 등록해도된다(registerReceiver() 호출)
매니페스트 파일
https://developer.android.com/guide/topics/manifest/manifest-intro.html?hl=ko
불러오는 중입니다... 인텐트에 응답할 수 있는 구성 요소를 시스템이 식별하는 방법
기기상의 다른 앱의 매니페스트 파일에 선언된 인텐트 필터를 수신된 인텐트와 비교
<intent-filter> 엘리먼트 안에 하위 엘리먼트들로 선언됨
기기호환성
안드로이드는 다양한 디바이스 위에서 동작한다.
시스템은 매니페스트에 선언된 요구사항들을 모두 읽진 않지만 Google Play 같은 외부 서비스는
필터링을 제공하기 위해 SW 요구사항등의 선언을 읽는다.
기기호환성
https://developer.android.com/guide/practices/compatibility.html?hl=ko
앱 리소스
리소스마다 SDK 빌드 도구가 고유한 정수ID를 정의
이를이용해 코드에서의 리소스나 XML로 정의된 다른 리소스에서 참조가능
여러가지 구성환경에 맞게 다른 리소스를 표기할 수 있다.
화면이 세로에서 가로가 될때 레이아웃이 변경하고싶으면
각각의 레이아웃을 정의하여 적절한 한정자를 각 레이아웃의 디렉터리이름에 적용한다
리소스 제공
https://developer.android.com/guide/topics/resources/providing-resources.html?hl=ko
리소스에는
레이아웃, 문자열,이미지,폰트 등..
모든 리소스는 app/src/main/res 의 서브디렉토리안에 저장됨
Context 클래스 메소드 (Activity는 Context 의 자식이므로 액티비티 상속시 사용가능)
- Resources getResources()
현재 앱 패키지의 Resource 객체 반환
android.content.res.Resources 클래스 메소드
- int getIdentifier(String name, String defType, String defPackage)
반환값 : 리소스 아이디(int 형) . 찾지 못하면 0 반환
name : 찾고자하는 리소스 이름.
"package:type/entry" 같이 완전한 형식으로 지정해도 된다. 이경우 뒤의 인자들은 null로 설정
defType : 리소스 타입(속성 또는 태그이름)
defPackage : 리소스가 속한 패키지 이름
앱 컨텍스트 Application Context
프로젝트가 컴파일될때 모든 리소스에 대한 정보를 참조하는 R이라는 클래스가 자동생성됨
또한 앱의 매니페스트파일과 리소스가 결합해 애플리케이션 컨텍스트가 생성됨
Context 클래스로 나타내
런타임시 앱리소스에 접근하기 위해 코드에서 사용할수있음
런타임시 정보를 수집하고 앱환경을 변경하기 위해
컨텍스트에서 여러가지 메서드가 호출될 수 있음
R 클래스
리소스를 참조할 수 있도록
프로젝트의 모든 리소스에 대한 ID를
변수명으로 하여 주소값들을 저장한 클래스이다
시스템에서 자동으로 생성하고 관리됨
Cannot resolve symbol R 에러가 자주뜨니 주의..
일차적인 해결방안 : menu탭->project->clean
Gradle 빌드시스템
Gradle : 안드로이드 스튜디오가 사용하는 빌드 툴킷
빌드 프로세스 자동화 및 관리
사용자설정 빌드 구성 정의 가능
Gradle과 Android 플러그인은 안드로이드와 독립적으로 실행됨
Android Studio가 설치되지 않은 컴퓨터도 Android 앱을 빌드할 수 있음
Gradle 설정파일 : settings.gradle
앱을 빌드할때 어떤 모듈을 포함할지 Gradle에게 알림
대부분 다음 코드만을 포함한 간단한 파일임
include ‘:app’다중 모듈 프로젝트에서는 최종 빌드에 들어갈 각 모듈을 지정
최상위 빌드파일 : build.gradle
프로젝트의 모든 모듈에 적용되는 빌드 구성 정의
모든 모듈에 공통되는 Gradle 저장소와 종속성을 정의하기 위해 buildscript 블록을 사용
프레임워크
액티비티 매니저 : 앱의 생명주기와 액티비티 스택 제어
콘텐츠 제공자 : 앱이 다른 앱과 데이터를 게시하고 공유할 수 있게함
리소스 매니저 : 리소스(문자열,색상설정,UI레이아웃 등)의 엑세스 제공
통지 매니저(Notifications Manager) : 앱이 사용자에게 경고나 통지를 보여줄수있게함
뷰 시스템 : 앱이 UI 생성시 사용되는 확장 가능한 뷰들의 집합
패키지 매니저 : 앱에서 장치에 설정된 다른 앱에 관한 정보를 알 수 있는 시스템
텔레포니 매니저(Telephony Manager) : 장치에서 사용가능한 전화 서비스에 관한 정보(상태나 가입자 등)을 앱에 제공
위치 매니저 : 앱이 위치변경 정보를 수신할 수 있게해주는 위치 서비스 액세스 제공
주요 라이브러리
android.app : 앱 모델의 엑세스 제공, 모든 안드로이드 앱의 시작이 되는 라이브러리
android.content : 앱과 앱 컴포넌트 간의 콘텐츠 액세스와 메시징을 가능하게 함
android.database : 콘텐츠 제공자가 게시한 데이터를 액세스할때, SQLite 데이터베이스 관리에 대한 클래스 제공
android.graphics : 색상,포인트,컬러, 사각형, 캔버스를 포함하는 낮은 수준의 2D 그래픽 API
android.hardware : 가속도 센서와 같은 단말에 부착된 하드웨어 액세스를 제공하는 API
android.opengl : OpenGL ES 3D 그래픽 렌더링 API 의 자바 인터페이스
android.os : 메시지,시스템 서비스, 프로세스 간 통신을 포함하는 OS 서비스의 액세스 제공
android.media : 오디오와 비디오의 재생을 할 수 있는 클래스를 제공
android.net : 네트워크 액세스를 제공, 장치의 무선 네트워크 액세스를 제공하는 android.net.wifi를 포함
android.print : 안드로이드 앱에서 프린터로 콘텐츠를 전송할 수 있는 클래스 제공
android.provider : 캘린더나 연락처 앱에서 유지하는 것과같은 표준 안드로이드 콘텐츠 제공자 데이터베이스 액세스 제공
android.text : 장치 화면에 텍스트를 나타내고 처리
android.util : 문자열과 숫자변환, XML 처리, 날짜와 시간 처리 등의 일을 수행하는 유틸리티 클래스 집합
android.view : 앱의 UI를 구성하는 뷰 클래스
android.widget : 버튼, 라벨, 리스트 뷰, 레이아웃 매니저, 라디오 버튼과 같은 사전에 제작된 UI 컴포넌트들
android.webkit : 웹 브라우징 능력을 앱에서 구성할 수 있게함
그외 라이브러리 참고
https://developer.android.com/reference/packages
'Android' 카테고리의 다른 글
Intent 인텐트, 인텐트 필터 정리 (0) 2019.07.03 액티비티 Activity (0) 2019.07.01 앱 호환성 build.gradle (0) 2019.07.01 뷰 속성 (0) 2019.06.24 안드로이드 프로그래밍 (0) 2019.06.18