이미 소장하고 있다면 판매해 보세요.
|
1장 처음 만드는 안드로이드 애플리케이션 1
앱 기본사항 2 안드로이드 프로젝트 생성하기 3 사용자 인터페이스 레이아웃 만들기 10 레이아웃 XML에서 뷰 객체로 18 위젯을 코드와 연결하기 22 토스트 만들기 27 에뮬레이터에서 실행하기 29 안드로이드 앱 빌드 절차 41 2장 안드로이드와 모델-뷰-컨트롤러 45 새로운 클래스 만들기 46 모델-뷰-컨트롤러와 안드로이드 49 뷰 계층 수정하기 51 컨트롤러 계층 수정하기 54 장치에서 실행하기 59 아이콘 추가하기 62 챌린지 66 챌린지: 리스너를 TextView에 추가하기 67 챌린지: 이전 버튼 추가하기 67 챌린지: Button을 ImageButton으로 변경하기 68 3장 액티비티 생명주기 71 액티비티 생명주기 로깅하기 73 장치 회전과 액티비티 생명주기 79 장치 회전 시 데이터 저장하기 84 액티비티 생명주기 다시 알아보기 86 onSaveInstanceState(Bundle) 테스트하기 88 로깅 레벨과 관련 메서드들 90 4장 안드로이드 앱의 디버깅 91 예외와 스택 기록 92 안드로이드 특유의 디버깅 102 5장 두 번째 액티비티 만들기 107 두 번째 액티비티 준비하기 108 액티비티 시작시키기 116 액티비티 간의 데이터 전달 119 안드로이드가 액티비티를 어떻게 알까? 130 챌린지 132 6장 안드로이드 SDK 버전과 호환성 135 안드로이드 SDK 버전 135 호환성과 안드로이드 프로그래밍 137 안드로이드 개발자 문서 사용하기 143 챌린지: 빌드 버전 보여주기 146 7장 UI 프래그먼트와 프래그먼트 매니저 147 UI 유연성의 필요 148 프래그먼트 개요 149 CriminalIntent 앱 개발 시작하기 150 UI 프래그먼트의 호스팅 161 UI 프래그먼트 생성하기 165 UI Fragment를 FragmentManager에 추가하기 171 프래그먼트 사용 시의 애플리케이션 아키텍처 177 지원 라이브러리의 프래그먼트가 좋은 이유 178 각 안드로이드 버전의 표준 라이브러리 사용 179 8장 레이아웃과 위젯으로 사용자 인터페이스 생성하기 181 Crime 업그레이드하기 181 레이아웃 변경하기 183 위젯을 코드와 연결하기 185 XML 레이아웃 속성 더 자세히 알아보기 186 그래픽 레이아웃 도구 사용하기 191 챌린지: 날짜의 형식 만들기 201 9장 RecyclerView로 리스트 보여주기 203 CriminalIntent의 모델 계층 변경하기 205 프래그먼트의 호스팅을 위한 추상 액티비티 208 RecyclerView, Adapter, ViewHolder 214 리스트 항목의 커스터마이징 223 리스트 항목 선택에 응답하기 229 ListView와 GridView 231 싱글톤 231 10장 프래그먼트 인자 사용하기 233 프래그먼트로부터 액티비티 시작시키기 234 프래그먼트 인자 239 리스트를 다시 로드하기 242 프래그먼트로부터 결과 받기 244 챌린지: 효율적으로 RecyclerView를 다시 로드하기 245 프래그먼트 인자를 사용하는 이유가 뭘까? 246 11장 ViewPager 사용하기 247 CrimePagerActivity 생성하기 249 FragmentStatePagerAdapter vs. FragmentPagerAdapter 255 ViewPager가 실제로 동작하는 방법 257 코드에서 뷰의 레이아웃 처리하기 258 12장 대화상자 261 AppCompat 라이브러리 262 DialogFragment 생성하기 263 두 프래그먼트 간에 데이터 전달하기 271 챌린지: 더 많은 대화상자 만들기 282 챌린지: 응답 가능한 DialogFragment 282 13장 툴바 283 AppCompat 라이브러리 284 메뉴 287 계층적 내비게이션 활성화하기 298 대체 액션 항목 300 툴바 vs 액션 바 306 챌린지: 범죄 데이터 삭제하기 306 챌린지: 복수형 문자열 리소스 307 챌린지: 텅 빈 RecyclerView 307 14장 SQLite 데이터베이스 309 스키마 정의하기 310 데이터베이스 생성하기 312 CrimeLab의 코드 삭제 317 데이터베이스에 데이터 쓰기 318 데이터베이스의 데이터 읽기 321 애플리케이션 컨텍스트 328 챌린지: 범죄(Crime) 데이터 삭제하기 329 15장 암시적 인텐트 331 버튼 추가하기 332 모델 계층에 용의자 추가하기 335 포맷 문자열 사용하기 337 암시적 인텐트 사용하기 339 챌린지: ShareCompat 351 챌린지: 또 다른 암시적 인텐트 351 16장 인텐트를 사용한 사진 찍기 353 사진을 위한 장소 353 외부 스토리지 358 카메라 인텐트 사용하기 361 비트맵 크기 조정과 보여주기 364 사용할 장치 기능 선언하기 368 Include 사용하기 369 챌린지: 큰 사진 보여주기 369 챌린지: 효율적으로 섬네일 이미지 로드하기 370 17장 다중 패널 마스터-디테일 인터페이스 371 레이아웃의 유연성 추가하기 373 프래그먼트의 보스인 액티비티 380 장치 크기 결정에 관해 추가로 알아보기 391 18장 에셋 393 리소스 형태가 아닌 에셋 394 BeatBox 생성하기 394 에셋 가져오기 399 에셋 알아내기 401 에셋 사용 코드 추가하기 404 에셋 파일 액세스하기 407 openNonAssetFd(...) 메서드 407 19장 SoundPool을 사용한 오디오 재생 409 SoundPool 생성하기 410 음원 로드하기 411 음원 재생하기 413 음원 클린업하기 415 장치의 방향 회전과 객체의 지속성 416 유보를 할 것인가 말 것인가 421 장치 회전 처리 시의 추가 고려 사항 421 20장 스타일과 테마 425 색상 리소스 426 스타일 426 테마 430 테마 색상 추가하기 432 테마 속성 오버라이드하기 434 버튼 속성 변경하기 439 스타일 상속을 추가로 알아보기 442 테마 속성 사용하기 442 챌린지: 적합한 기본 테마 443 21장 XML drawables 445 균일한 버튼 만들기 446 형태 drawable 447 상태 리스트 drawable 449 레이어 리스트 drawable 451 XML drawable을 사용해야 하는 이유 452 9-patch 이미지 453 Mipmap 이미지 458 22장 인텐트와 태스크 461 NerdLauncher 준비하기 462 암시적 인텐트 해결하기 465 런타임 시에 명시적 인텐트 생성하기 470 태스크와 Back 스택 472 NerdLauncher를 홈 화면으로 사용하기 477 챌린지: 앱 아이콘 사용하기 478 프로세스 vs. 태스크 479 동시 문서 482 23장 HTTP & 백그라운드 태스크 485 PhotoGallery 생성하기 487 네트워킹 기본 490 AsyncTask를 사용해서 백그라운드 스레드로 실행하기 492 Main 스레드 494 플리커에서 JSON 가져오기 497 AsyncTask로부터 main 스레드로 돌아오기 505 AsyncTask 클린업하기 509 AsyncTask에 관해 추가로 알아보기 510 AsyncTask의 대안 511 챌린지: Gson 512 챌린지: 페이징 513 챌린지: 열의 개수를 동적으로 조정하기 513 24장 Looper, Handler, HandlerThread 515 이미지를 보여주기 위해 RecyclerView 준비하기 515 다운로드 관련 고려 사항들 518 main 스레드와 소통하기 519 백그라운드 스레드 만들기 521 메시지와 메시지 핸들러 524 AsyncTask vs. Threads 536 챌린지: 프리로딩과 캐싱 536 이미지 다운로딩 관련 문제 해결하기 537 25장 검색 539 플리커 검색하기 540 SearchView 사용하기 545 공유 프레퍼런스를 사용한 간단한 데이터 보존 551 앱 다듬기 555 챌린지: 다듬기 한 번 더! 556 26장 백그라운드 서비스 557 IntentService 생성하기 557 서비스의 필요성 561 새로운 결과 찾기 563 AlarmManager를 사용한 지연 실행 565 알람 제어하기 570 통지(알림) 573 챌린지: 안드로이드 웨어의 통지 577 서비스 자세히 알아보기 578 JobScheduler와 JobServices 582 동기 어댑터 585 챌린지: JobService 사용하기 587 27장 브로드캐스트 인텐트 589 일반 인텐트 vs. 브로드캐스트 인텐트 589 장치 부팅 시 앱 깨우기 590 포그라운드 통지의 필터링 596 수신자와 오래 실행되는 태스크 608 로컬 이벤트 609 프래그먼트의 가시성 검출하기 611 28장 웹과 웹뷰의 브라우징 613 플리커 데이터에서 하나 더 알아둘 사항 614 쉬운 방법: 암시적 인텐트 616 더 어려운 방법: WebView 618 WebView에서의 올바른 방향 전환 처리 625 자바스크립트 객체 추가하기 627 킷캣의 WebView 기능 향상 628 챌린지: 브라우저 검색 기록에 Back 버튼 사용하기 629 챌린지: Non-HTTP 링크 지원하기 629 29장 커스텀 뷰와 터치 이벤트 631 DragAndDraw 프로젝트 설정하기 632 커스텀 뷰 생성하기 634 터치 이벤트 처리하기 637 onDraw(...) 내부에서 렌더링하기 642 챌린지: 상태 정보 저장하기 645 챌린지: 박스의 방향 회전 645 30장 속성 애니메이션 647 장면 생성하기 647 간단한 속성 애니메이션 651 여러 애니메이터를 함께 사용하기 659 다른 애니메이션 API 661 챌린지 662 31장 위치와 플레이 서비스 663 위치와 라이브러리 664 Locatr 프로젝트 생성하기 665 플레이 서비스와 위치 테스트를 위한 에뮬레이터 준비하기 666 Locatr 만들기 671 구글 플레이 서비스 설정하기 674 구글 플레이 서비스 사용하기 676 플리커 사이트 이미지의 지리 데이터 검색 679 위치 데이터 얻기 679 플리커 이미지를 찾아 보여주기 682 챌린지: 진척도 보여주기 685 32장 구글 맵 687 플레이 서비스 맵 라이브러리 import하기 687 안드로이드의 맵 사용 688 맵 API 설정하기 689 맵 설정하기 694 더 많은 위치 데이터 얻기 696 맵 사용하기 699 33장 머티리얼 디자인 705 머티리얼 서피스 706 애니메이션 도구 711 뷰 컴포넌트 717 34장 책을 마무리하며 723 마지막 챌린지 723 부담 없는 연락처 724 감사합니다 724 부록 A 에뮬레이터에서 한글 사용하기 725 한글 출력하기 725 한글 입력하기 729 애플리케이션에서 한글 입출력하기 732 찾아보기 735 |
|
안드로이드 애플리케이션을 실행하려면 스마트폰이나 태블릿 등과 같은 실제 장치나 안드로이드 가상 장치(Android Virtual Device, AVD) 중 하나가 필요하다. AVD는 안드로이드 SDK에 포함되어 함께 배포되며, 각 실제 장치와 동일한 런타임 환경으로 실행될 수 있도록 에뮬레이터로 생성되어야 한다. 즉, 에뮬레이터는 실제 장치에서 실행되는 안드로이드 운영체제와 거의 유사하며, 쉽게 말해 개발 컴퓨터에서 안드로이드 운영체제가 따로 실행된다고 보면 된다.
_29 지금부터는 우리가 액티비티 사이를 이동할 때 안드로이드 운영체제에서 어떻게 하는지 살펴보자. 우선 GeoQuiz 앱을 실행하면 안드로이드 운영체제는 애플리케이션을 시작시키는 것이 아니라 애플리케이션의 액티비티를 시작시킨다. 조금 더 구체적으로 말하면, 애플리케이션의 론처(launcher) 액티비티를 시작시킨다. GeoQuiz의 경우에는 QuizActivity가 론처 액티비티다. _130 위젯 정의 시에 다른 위젯의 ID를 참조 사용할 때는 id 앞에 +를 넣지 않는다. + 기호는 레이아웃 파일에 처음 나타나는 ID를 생성하는 데 사용되며, android:id 속성에 넣는다. 그리고 필요하다면 다른 곳에서 ID를 생성하기 위해 +를 사용할 수 있다. 그러나 위젯의 android:id 속성에 ID를 포함시키는 것이 레이아웃 파일을 이해하기 쉽다. _226 안드로이드에서 암시적(implicit) 인텐트를 사용하면 장치의 다른 애플리케이션에 있는 액티비티를 시작시킬 수 있다. 명시적(explicit) 인텐트에서는 시작시킬 액티비티 클래스를 우리가 지정하면 안드로이드 운영체제가 그 액티비티를 시작시킨다. 암시적 인텐트에서는 우리가 필요한 작업을 알려주면 그 작업에 적합한 애플리케이션의 액티비티를 안드로이드 운영체제가 찾아서 시작시켜준다. _331 스타일은 멋지다. 속성들의 집합을 한 곳에서 정의한 후 우리가 원하는 어떤 위젯에도 적용할 수 있다. 그러나 스타일에도 단점이 있다. 적용하기를 원하는 각 위젯에 일일이 적용해야 한다. 만일 우리 앱이 더 복잡해서 많은 레이아웃에 버튼들도 많이 있다면? 이 경우 앞에서처럼 BeatBoxButton 스타일을 모든 버튼에 적용하려면 상당히 성가신 일이 될 것이다. ---p.430 |