1. Android 개요 & 기본 위젯
1.1 휴대폰의 진화
1.1.1 1세대 폰
음성통신
흑백, 저해상도
전화 본연의 기능
1.1.2 2세대 폰
문자 통신
컬러 LCD, 고해상도
융합기능(MP3, DMB, 카메라, 캠코더)
1.1.3 3세대 폰(3G) - 스마트폰
데이터 통신
대형 LCD, 터치스크린
PC 기능(인터넷, 이메일, 문서 작성)
1.1.4 4세대 폰(4G, LTE)
초고속 대용량 통신(50M ~ 1G)
2007년 세계무선통신회의(World Radio Conference, WRC)에서 새로운 통신 규격으로 채택됨
1.1.5 5세대 폰(5G)
4G보다 1,000배 빠른 최대 100Gbps의 속도
유비쿼터스 시스템, 가상화, 클라우드 서비스 지원
만물 인터넷(사물 인터넷보다 더 발전된 개념, 만물이 인터넷에 연결되는 환경)의 구현
1.2 모바일 OS의 개요
1.2.1 핸드폰에 탑재되는 OS
일반 휴대폰과 달리 별도의 운영체제를 탑재해 PC의 기능을 발휘
휴대폰으로 전자메일이나 메신저 등의 PC에서 사용하는 인터넷 서비스를 자유롭게 이용
모바일 운영체제(OS)가 탑재된 폰을 스마트폰이라 함
1.2.2 휴대전화와 개인휴대단말기(PDA)의 장점을 혼합
휴대전화에 일정 관리, 인터넷 접속 등의 데이터 통신 기능 추가
향상된 기능과 더욱 폭넓은 서비스를 제공하기 위한 OS가 요구됨
각 모바일 회사들은 자사 제품에 맞는 모바일 OS 개발 경쟁 중
1.3 안드로이드란?
구글의 오픈소스 모바일 OS
리눅스 기반 OS
초창기 자바(이클립스)로 개발
안드로이드 마켓(앱스토어)
1.3.1 안드로이드 플랫폼의 특징
다양한 벤더 : 모토로라(Motorola), HTC, 삼성전자, LG전자, 팬택(Pantech) 등
단말기 보급 확대
안드로이드 앱 마켓 확대
1.3.2 안드로이드의 역사
- 2007. 11. 5: OHA에서 안드로이드 1.0 발표
이동통신 단말기 및 서비스 개발과 유통에 드는 비용 절감을 위해 단말기, 반도체, 통신 서비스, 소프트웨어, 상용화 등 5가지 분야를 대표하는 회사들의 연합 - 2007. 11. 12: 안드로이드 초기 버전 SDK 배포
- 2008. 8. 28: 안드로이드 마켓 발표
1.3.3 안드로이드 SDK의 버전
1.3.4 안드로이드 OS 점유율
1.3.5 안드로이드 플랫폼의 구조
1.3.5.1 리눅스 커널
장치 드라이버, 네트워킹 관리
메모리, 프로세스 관리 효율성
공유 라이브러리
퍼미션 기반 보안 모델
오픈 소스
1.3.5.2 라이브러리
C/C++
JNI(Java Native Interface)를 이용해 애플리케이션 호출
Surface Manager, 2D/3D 그래픽, 미디어 코덱, SQLite, Webkit
1.3.5.3 안드로이드 런타임(Dalvik - 안드로이드용 자바 VM)
구글이 만든 저전력, 저메모리 환경의 VM
하나의 프로세스에 하나의 VM 인스턴스가 생성
여러 개의 VM 인스턴스가 한 번에 실행 가능
Dalvik Executable(.dex) 포맷의 파일을 실행
.dex 파일은 표준 .class와 .jar 파일을 컴팩트하게 변환한 것
1.3.5.4 Dalvik
안드로이드에 탑재되는 가상머신
아이슬란드 출신의 본스타인이 개발
Dalvik은 아이슬란드의 어촌 마을 이름
1.3.5.5 Dalvik의 특징
자바 클래스들을 Dalvik 실행파일(.dex)로 합침(실행 가능한 코드는 자바 바이트 코드가 아닌 dex 파일)
.jar 파일에 비해 절반 정도의 크기로 압축
JIT(Just In Time) 컴파일러를 사용하지 않음
스택 대신 레지스터에 데이터를 저장하여 성능 향상 도모
레이아웃 정의를 위해 XML 파일 이용 - 바이너리 파일로 컴파일됨
1.3.6 안드로이드 애플리케이션의 구성
화면 → 액티비티
백그라운드 처리 → 서비스
데이터 공유 → 컨텐트 프로바이더
시스템 이벤트 수신 → 브로드캐스트리시버
애플리케이션 통신 → 인텐트
1.3.7 Activity
1.3.7.1 애플리케이션 구성의 기본 단위
Ex) 연락처 조회, 편집
1.3.7.2 비주얼 인터페이스를 가지는 애플리케이션
하나의 액티비티에는 그리기가 가능한 윈도우를 부여함
하나의 애플리케이션은 여러 액티비티로 구성 가능
1.3.7.3 Activity class를 상속받음
1.3.7.4 정해진 라이프 사이클을 따라 움직임
- onCreate: 액티비티 생성(최초 1회), 가로/세로 전환시 호출됨
- onResume: 다른 화면으로 갔다가 다시 돌아올 때
- onPause: 다른 화면으로 이동할 때(잠시 멈춤, 화면상에서만 숨김 처리됨)
- onDestroy: 현재 액티비티가 종료될 때(메모리에서 제거됨)
1.3.8 Service
보이지 않는 애플리케이션
화면 없이 백그라운드로 실행
Service 클래스를 상속받음
Ex) 음악 재생, RSS 확인 등
1.3.9 Broadcast receiver
브로드캐스트되는 메세지에 응답
주로 시스템 상태에 관련된 메세지에 반응
BroadcastReceiver 클래스를 상속받음
사용자에게 알리기 위해서는 알림화면(notification, toast)을 사용
ex. 시간대 변경, 환경설정 변경, 파일 다운로드 상태
1.3.10 Content Provider
다른 애플리케이션이 사용할 수 있도록 특정 애플리케이션의 데이터를 제공해주는 인터페이스
ContentProvider 클래스를 상속
ex. SQLite, File, Memory 등
1.3.11 Intent
화면 전환 또는 서비스 호출 방법
액티비티에서 다른 액티비티나 서비스 호출
액티비티, 서비스, 브로드캐스트 리시버를 호출하거나 컴포넌트를 호출함과 동시에 데이터를 전달
1.3.12 안드로이드 애플리케이션의 작성과 구동
1.3.12.1 작성과 배포
안드로이드 애플리케이션은 java로 작성 후 컴파일
컴파일된 java 클래스는 애플리케이션에 필요한 데이터가 추가되어 *.apk 파일로 생성
*.apk는 안드로이드 배포, 설치 버전
1.3.12.2 애플리케이션은 리눅스 프로세스 내에서 실행
각 애플리케이션에는 고유한 리눅스 userid가 부여
각 프로세스는 자기 자신의 java 가상 머신 사용
1.4 안드로이드 개발 환경 설정
1.4.1 안드로이드 공식 사이트
1.4.2 안드로이드의 개발 방식
- 이클립스로 개발: 속도는 빠르지만 더 이상 지원되지 않음(구버전)
- 이클립스 플러그인 URL - 안드로이드 스튜디오로 개발 : 속도가 느린 편이지만 현재 안드로이드 공식 개발 툴
- 컴파일 버전은 7.1.1로 실습하고 에뮬레이터는 5.1(롤리팝) 권장
- 에뮬레이터는 속도가 느리므로 안드로이드 스마트폰에 테스트 권장
- 에뮬레이터를 사용할 경우 x86 이미지를 사용하고 설치가 안될 경우 ARM 이미지로 생성함
1.4.3 안드로이드 프로젝트의 구조
- java - 자바 코드
- res - 리소스
drawable: 이미지, 아이콘
layout : 화면 레이아웃
values : 텍스트, 색상, 배열
자바 클래스(컨트롤러)와 리소스(뷰)의 연결을 위해 R.java 클래스가 자동으로 작성됨
AndroidManifest.xml: 앱의 환경설정, 사용권한 등의 정보
1.5 안드로이드 코드 작성 시 기본 사항
1.5.1 String
스트링은 다국어 처리를 위해 정적인 텍스트보다는 strings.xml에 작성할 것을 권장함
@string/hello_world: res/values/strings.xml의 name이 hello_world인 태그
1.5.2 Toast
Toast.makeToast(컨텍스트, 메세지, 시간).show();
1.5.3 Activity(액티비티)
화면을 가지는 프로그램
1.5.4 Service(서비스)
화면 없이 백그라운드에서 실행되는 프로그램
1.5.5 Context(컨텍스트)
프로그램의 흐름(현재 실행중인 화면)
1.5.6 getApplicationContext()
현재 실행중인 액티비티(화면)의 이름
1.5.7 Widget(위젯)의 길이 설정
- wrap_content: 필요한 사이즈만큼
- fill_parent: 100% '구 버전임; match_parent로 바뀜
- match_parent: 상위 Widget을 기준으로 100%
1.5.8 텍스트의 폰트 사이즈
android:textSize = "36sp"
sp: System Pixel Size (디바이스에 상대적인 사이즈, 텍스트에 사용됨)
dp: Dependent Pixel Size (widget에 사용됨)
pt, px: 비추천
1.5.9 로그 출력 방법(로그캣에 출력됨)
// 로그의 옵션은 기능적으로는 동일하며 색상 구분 처리됨
Log.옵션("태그", "메시지");
- Log.i
- Log.v
- Log.e
- Log.w
1.5.10 화면 이동 방법
Intent(인텐트) - 활동(화면 전환)
new Intent(현재화면.this, 다음화면.class)
startActivity(인텐트)
1.5.11 안드로이드 스튜디오 설정
InteliJ 기반의 툴
Gradle : InteliJ에서 사용하는 빌드(빌드란? 클래스들을 컴파일하고 실행 파일을 생성하는 것) 도구
1.5.11.1 Editor - General - Appearance - Show line numbers 체크
1.5.11.2 Keymap - Eclipse로 설정
1.5.11.3 Editor - General - Auto import(자동 import 옵션)
Optimize imports on the fly 체크
Add unambiguous imports on the fly 체크
'코딩하다가 자동으로 import가 된다.
1.5.11.4 레이아웃 디자이너에 한글이 출력되도록 설정
C:\Program Files\Android\Android Studio\plugins\android\lib\layoutlib\data\fonts
디렉토리의 fonts.xml에 아래 코드 추가
<familyset version="22">
...
<family lang="ko-kr">
<font weight="400" style="normal">NanumGothic.ttf</font>
</family>
</familyset>
1.5.12 R.java를 보는 방법
Project Files로 변경
Show member 체크
app/build/generated/source/r/debug/R.java 확인
1.5.13 Container와 Component
Container: 컴포넌트를 담을 수 있음
1.5.14 Widget
View: 최상위 위젯
1.5.15 이벤트 처리 방법
- 위젯 변수 선언
- 위젯 객체 생성 (R.java에서 아이디 참조)
findViewById(리소스아이디); - 이벤트 처리
뷰.setOn이벤트Listener(이벤트 핸들러 구현);
1.5.16 레이아웃의 종류
- RelativeLayout: 다른 위젯을 기준으로 상대적인 배치
- LinearLayout: 위에서 아래로, 좌에서 우로 순서대로 배치
1.5.17 리소스의 id 규칙
- android:id="@+id/아이디"
@ → Resource를 의미
+id → R.java에 id를 추가 - android:id="@id/아이디"
R.java에 있는 id를 검색(추가가 아님) - android:id="@android:id/아이디"
android 내장 R.java에 있는 id를 검색
1.5.18 한글키보드 설치
platform tools 디렉토리로 이동
C:\Users\사용자계정\AppData\Local\Android\sdk\platform-tools이 디렉토리를 환경변수-path에 추가
cmd
cd C:\Users\사용자계정\AppData\Local\Android\sdk\platform-tools
adb install hangulkeyboard.apk
1.5.19 안드로이드 추천 사이트
- 안드로이드 펍
- http://www.androidside.com
- http://www.kandroid.org