저자소개 ... 5 옮긴이의 말 ... 6 들어가며 ... 12 Part 1 핵심개념 01 개요 ... 17 스마트폰 프로그래밍의 장단점 ... 17 안드로이드 프로그램 구조 ... 19 안드로이드에서 사용 가능한 기능 ... 20 나머지 부분에 대한 요약 ... 21 02 안드로이드 설치 ... 22 1단계 : 자바 설치 ... 22 2단계 : 안드로이드 SDK 설치 ... 24 3단계 : 이클립스를 위한 ADT 설치 ... 28 4단계 : 아파치 Ant 설치 ... 30 5단계 : 애뮬레이터 설정 ... 31 6단계 : 실체 휴대폰을 위한 설정 ... 35 03 안드로이드 프로젝트 ... 38 1단계 : 새로운 프로젝트 생성 ... 38 2단계 : 애플리케이션 컴파일, 설치 그리고 에뮬레이터나 휴대폰에서의 실행 ... 42 04 첫 프로젝트 점검 ... 46 프로젝트 구조 ... 46 매니페스트 파일 ... 49 05 이클립스 ... 52 ADT가 제공하는 것 ... 52 이클립스 다루기 ... 53 IDE들을 대체할 수 있는 것 ... 59 IDE와 이 책의 관계 ... 60 06 첫 프로젝트 향상 ... 61 다양한 크기의 화면 지원 ... 61 특징 버전들 ... 62 Part 2 액티비티 07 첫 프로젝트 재작성 ... 67 액티비티 ... 67 액티비티 분석 ... 68 액티비티의 구축과 실행 ... 70 08 XML 기반 레이아웃 사용 ... 72 XML 기반 레이아웃이란 무엇인가? ... 72 왜 XML 기반 레이아웃을 사용하는가? ... 73 XML 레이아웃은 어떻게 생겼는가? ... 73 @ 부호는 무엇인가? ... 75 어떻게 XML 레이아웃을 자바에 적용할 것인가? ... 75 종합 정리 ... 76 09 기본 위젯 ... 78 라벨 배치 ... 78 버튼은 누가 가지고 있는가? ... 80 이미지 사용하기 ... 80 녹색 필드와 다른 색상들 ... 82 다른 성질을 가진 체크 박스 ... 84 라디오 버튼 켜기 ... 86 보기 좋은 View ... 88 10 컨테이너(Container) ... 91 선형적 생각 ... 91 LinearLayout의 개념과 속성 ... 92 LinearLayout의 예제 ... 95 모든 위젯들의 상관관계 ... 101 오버랩 ... 106 공백 상태 ... 108 TableLayout 예제 ... 110 스크롤 작업 ... 112 11 입력메소드 프레임워크 ... 115 하드키보드와 소프트키보드 ... 115 요구에 대한 맞춤 기능 ... 116 안드로이드가 알려주는 선택에 대한 방향 제시 ... 120 맞게 조정하기 ... 123 IME가 불필요한 경우 ... 124 12 선택 위젯 사용하기 ... 126 상황에 적응하기 ... 126 ArrayAdapter 사용하기 ... 127 부적당한 리스트와 좋은 리스트 ... 128 선택 모드 ... 130 회전 제어 ... 132 격자무늬 ... 136 필드 : 지금부터는 35% 적게 타이핑! ... 140 갤러리 ... 144 13 리스트 고급 활용 ... 145 가방 기본적인 작업 ... 145 동적 표현 ... 148 각 행의 팽창하기 ... 150 성능 개선 ... 153 14 고급 위젯과 컨테이너 ... 164 엄선하기 ... 164 시간 유지 ... 169 탐색 슬라이더 ... 171 탭에 삽입하기 ... 172 연동하기 ... 174 탭의 넘김 기능 ... 180 서랍에서 가져오기 ... 186 그 밖의 다른 좋은 위젯들 ... 189 15 웹킷 브라우저 삽입 ... 191 작은 문서에 대한 브라우저 ... 191 원하는 내용 불러오기 ... 194 네비게이션 기능 ... 195 재미있는 클라이언트 ... 196 각 종류의 설정, 환경 설정과 옵션 ... 198 16 메뉴 적용 ... 199 메뉴의 특징 ... 199 옵션에서의 메뉴 ... 200 컨텍스트에서의 메뉴들 ... 201 간단히 살펴보기 ... 202 여전히 더 많은 팽창 ... 208 메뉴의 범위와 허니컴 ... 212 17 팝업 메시지 ... 213 토스트 띄우기 ... 213 경고! 경고! ... 214 팝업 메시지 확인하기 ... 215 18 액티비티 생명주기와 이벤트 ... 218 슈뢰딩거의 액티비티 ... 218 액티비티의 활동(생성)과 소멸 ... 219 상태의 유예기간 ... 221 19 회전처리 ... 222 소멸의 철학 ... 222 조금 다를 뿐이지 모두 동일하다 ... 223 이제 좀 더 많은 것을 저장해보자! ... 230 DIY 회전 ... 232 빠른 결정 강요하기 ... 236 그 모든 것의 타당성 ... 239 20 스레드 ... 241 메인 애플리케이션 스레드 ... 241 ProgressBar를 이용한 진행 처리하기 ... 242 핸들러 사용하기 ... 243 UI 스레드는 어디로 사라졌는가? ... 247 Async에 대한 느낌 ... 247 스레드와 회전 ... 255 그리고 현재, 주의 사항 ... 260 21 인텐트 필터 ... 262 인텐트 ... 262 인텐트 생성 ... 264 인텐트 리시버 ... 266 일시정지 문제 ... 267 22 액티비티 실행 ... 268 액티비티 종류 ... 268 실행 ... 269 탭 브라우징 ... 273 23 리소스 ... 277 리소스의 종류 ... 277 문자열 ... 278 이미지 ... 283 XML ... 285 기타 리소스 ... 288 환경에 맞는 리소스 선택 ... 290 RTL 언어 ... 294 24 스타일 ... 296 DIY DRY ... 296 스타일 엘리먼트 ... 298 Theme : 다른 스타일 ... 301 25 다양한 화면크기 ... 303 기본 화면 크기 ... 3003 화면 크기별 대응 ... 304 기기별 레이아웃 ... 307 밀도와 실제 크기 ... 310 레이아웃 변경 ... 312 예제 : EU4You ... 313 Part 3 허니컴과 태블릿 26 허니컴 UI 소개 ... 327 왜 허니컴인가? ... 327 사용자들이 보는 것들 ... 328 홀로그래픽 테마 ... 331 나머지 디바이스를 다루는 방법 ... 332 27 액션 바 ... 335 Action bar 사용 가능하게 만들기 ... 335 메뉴 아이템을 액션 바에 올리기 ... 336 Logo에 대응하기 ... 337 Custom view를 action bar에 추가하기 ... 338 휴대폰을 잊지 마라! ... 343 28 프래그먼트 ... 344 Fragment 소개 ... 344 Fragment class 만들기 ... 347 Fragments, 레이아웃, 액티비티 그리고 다양한 화면 크기 ... 355 Fragment와 설정 변경하기 ... 362 Fragment 설계하기 ... 362 29 플랫폼 변경 ... 364 실패하게 만드는 요인들 ... 364 API 변화에의 대처 ... 365 허니컴을 위한 패턴들 ... 370 30 파일 접근 ... 374 참조 데이터 사용 ... 374 읽기와 쓰기 ... 378 외부 저장장치: 거대한 이코노미 사이즈의 공간 ... 381 StrictMode : Janky 코드 피하기 ... 383 리눅스 파일 시스템 ... 387 Part 4 데이터저장, 네트워크 서비스, API 31 환경설정 ... 391 원하는 값 추출 ... 391 환경설텅 관리 ... 392 PreferenceActivity 소개 ... 393 환경설정 기능 제공 ... 394 구조 변경 ... 398 환경설정 팝업의 종류 ... 401 프래그먼트를 통한 환경설정 ... 405 32 로컬 데이터베이스 관리 및 실행 ... 412 SQLite 요약 웹문서 ... 414 시작하기 ... 414 표의 구축 ... 418 데이터 생성 ... 418 무엇이 오가는가 ... 420 플래시 : 원래보다 빠른 소리 ... 423 모든 곳에 존재하는 데이터 ... 424 33 자바 라이브러리 ... 426 Ants와 JARs ... 426 외부적 한계 ... 427 스크립트를 따라가기 ... 428 스크립트 리뷰 ... 432 34 인터넷을 통한 의사소통 ... 433 휴양과 휴식 ... 433 Internet-Aware 안드로이드 컴포넌트 ... 439 Janky 코드로부터 벗어나기 ... 450 Part 5 서비스 35 서비스 이론 ... 453 서비스가 왜 필요한가? ... 453 서비스 셋업하기 ... 454 서비스와의 소통 ... 456 서비스로부터 의사소통하기 ... 458 36 기본적인 서비스 패턴 ... 461 다운로더 ... 461 뮤직 플레이어 ... 466 웹 서비스 인터페이스 ... 470 37 알림(Notification) ... 485 알림 설정 ... 485 작동하는 알림 ... 488 포어그라운드에 위치하기 ... 491 알림과 허니콤 ... 494 Part 6 기타 안드로이드 능력 38 승인 문의 및 요청 ... 499 승인 받기 ... 499 보안 ... 500 구 애플리케이션에서의 새로운 승인 ... 503 승인 : 선불 또는 안함 ... 504 39 위치기반 서비스 접속 ... 505 위치 제공자 ... 505 위치 제공자 선택 ... 506 이동 ... 507 목적지 ... 509 테스트 ... 510 40 MapView와 MapActivity로 Mapping하기 ... 511 약정 ... 511 Piling on ... 512 API KEY ... 512 베어본 ... 513 맴 컨트롤 ... 516 레이어 위의 레이어 ... 517 MyLocationOverlay ... 520 험한 지형 ... 521 지도와 Fragment들 ... 522 41 휴대폰 전화 다루기 ... 527 매니저에게 보고하기 ... 527 전화 걸기!! ... 528 실제로 전화 걸기 ... 531 42 폰트(글자체) ... 532 글자체를 사랑하자 ... 532 추가적인 서체들 ... 534 글리프 ... 536 43 개발 도구 ... 538 계층 탐색기 ... 538 DDMS : 안드로이드 후드 아래 ... 541 adb : DDMS ... 549 Part 7 애플리케이션 환경 44 안드로이드 대체 환경 ... 553 자바 ... 553 장점 ... 554 트렌스 거스르기 ... 555 지원, 구조 ... 555 Caveat 개발자 ... 556 45 HTML5 ... 557 오프라인 애플리케이션 ... 44 웹 보관함 ... 563 상품 ... 566 단점 ... 567 HTML5와 대체 안드로이드 브라우저 ... 570 HTML5 : 기준 ... 570 46 PhoneGap ... 571 PhoneGap은 무엇인가 ... 571 사용 ... 574 PhoneGap과 Checklist 예제 ... 578 만나게 되는 문제들 ... 584 더 많은 정보 ... 586 47 다른 대체 환경 ... 587 Rhodes ... 587 Flash, Flex, AIR ... 588 Jruby와 Ruoto ... 588 안드로이드에 대한 MONO ... 588 App Inventor ... 589 티타늄 모바일 ... 591 다른 Jvm 컴파일 언어 ... 591 Part 8 안드로이드의 진화 48 장치 다루는 법 ... 595 이 앱은 명확한 지시를 포함한다 ... 595 보장된 시장 ... 598 다양한 다른 것들 ... 599 버그 ... 599 디바이스 테스트 ... 600 49 당면과제 ... 601 질문과 답변 ... 601 소스를 향해 ... 602 뉴스 ... 603 찾아보기 ... 604