이미 소장하고 있다면 판매해 보세요.
|
Chapter 1 처음 만드는 안드로이드 애플리케이션 1
앱 기본사항 2 안드로이드 프로젝트 생성하기 3 안드로이드 스튜디오 둘러보기 6 UI 레이아웃 디자인하기 8 레이아웃 XML에서 뷰 객체로 18 위젯을 코드와 연결하기 21 토스트 만들기 25 에뮬레이터에서 실행하기 27 AVD 에뮬레이터 기능 살펴보기 35 궁금증 해소하기: 안드로이드 앱 빌드 절차 38 챌린지 40 챌린지: 토스트 커스터마이징 40 안드로이드와 모델-뷰-컨트롤러 41 새로운 클래스 만들기 42 모델-뷰-컨트롤러와 안드로이드 44 Chapter 2 안드로이드와 모델-뷰-컨트롤러 41 새로운 클래스 만들기 42 모델-뷰-컨트롤러와 안드로이드 44 뷰 계층 변경하기 46 컨트롤러 계층 변경하기 49 아이콘 추가하기 53 화면 픽셀 밀도 57 장치에서 실행하기 58 챌린지: TextView에 리스너 추가하기 60 챌린지: PREVIOUS 버튼 추가하기 60 챌린지: Button을 ImageButton으로 변경하기 61 Chapter 3 액티비티 생명주기 63 GeoQuiz 화면 회전시키기 64 액티비티 상태와 생명주기 콜백 64 액티비티 생명주기 로깅하기 67 로그 메시지 만들기 67 / LogCat 사용하기 70 액티비티 생명주기가 사용자 액션에 어떻게 응답하는지 살펴보기 71 일시적으로 액티비티 떠나기 71 / 액티비티 끝내기 74 / 액티비티 회전시키기 75 장치 구성 변경과 액티비티 생명주기 76 가로 방향 레이아웃 생성하기 76 궁금증 해소하기: UI 변경과 다중 창 모드 80 궁금증 해소하기: 로그 레벨 81 챌린지: 정답 맞춘 문제를 건너뛰기 82 챌린지: 점수 보여주기 82 Chapter 4 UI 상태 유지하기 83 ViewModel 의존성 추가하기 83 ViewModel 추가하기 85 프로세스 종료 시에 데이터 보존하기 95 ViewModel vs SIS 101 궁금증 해소하기: Jetpack, AndroidX, 그리고 아키텍처 컴포넌트 103 궁금증 해소하기: 섣부른 해결책 피하기 105 Chapter 5 안드로이드 앱의 디버깅 107 예외와 스택 기록 108 안드로이드 특유의 디버깅 117 챌린지: 프로파일러 살펴보기 122 Chapter 6 두 번째 액티비티 만들기 125 두 번째 액티비티 준비하기 126 액티비티 시작시키기 134 액티비티 간의 데이터 전달 136 안드로이드가 액티비티를 어떻게 알까? 146 챌린지: GeoQuiz 허점 보완하기 149 챌린지: 문제마다 커닝 여부 관리하기 149 Chapter 7 안드로이드 SDK 버전과 호환성 151 안드로이드 SDK 버전 151 호환성과 안드로이드 프로그래밍 153 안드로이드 개발자 문서 사용하기 160 챌린지: 장치의 안드로이드 버전 보여주기 163 챌린지: 커닝 횟수 제한하기 164 Chapter 8 UI 프래그먼트와 프래그먼트 매니저 165 UI 유연성의 필요 166 프래그먼트 개요 167 CriminalIntent 앱 개발 시작하기 168 새로운 프로젝트 생성하기 171 Crime 데이터 클래스 생성하기 172 UI 프래그먼트 생성하기 173 CrimeFragment의 레이아웃 정의하기 174 / CrimeFragment 클래스 생성하기 176 UI 프래그먼트의 호스팅 184 컨테이너 뷰 정의하기 185 / FragmentManager에 UI 프래그먼트 추가하기 187 프래그먼트를 사용하는 애플리케이션 아키텍처 192 프래그먼트 사용 여부 결정하기 193 Chapter 9 RecyclerView로 리스트 보여주기 195 새로운 프래그먼트 및 ViewModel 추가하기 197 프래그먼트에 사용되는 ViewModel 생명주기 199 RecyclerView 추가하기 201 항목 뷰 레이아웃 생성하기 204 ViewHolder 구현하기 206 어댑터를 구현해 RecyclerView에 데이터 채우기 209 RecyclerView의 어댑터 설정하기 212 뷰의 재활용: RecyclerView 214 리스트 항목의 바인딩 개선하기 214 리스트 항목 선택에 응답하기 216 궁금증 해소하기: ListView와 GridView 217 챌린지: RecyclerView의 ViewType 218 Chapter 10 레이아웃과 위젯으로 사용자 인터페이스 생성하기 219 ConstraintLayout 개요 220 레이아웃 편집기 개요 221 ConstraintLayout 사용하기 225 레이아웃 속성을 더 자세히 알아보기 239 궁금증 해소하기: 마진 vs 패딩 242 궁금증 해소하기: ConstraintLayout의 다른 기능 243 챌린지: 날짜 형식 지정하기 244 Chapter 11 데이터베이스와 Room 라이브러리 245 Room 아키텍처 컴포넌트 라이브러리 246 데이터베이스 생성하기 247 DAO 정의하기 251 리포지터리 패턴으로 데이터베이스 액세스하기 253 쿼리 테스트하기 257 애플리케이션의 스레드 259 LiveData 사용하기 262 궁금증 해소하기: 싱글톤 268 Chapter 12 프래그먼트 간의 이동 269 단일 액티비티: 프래그먼트의 우두머리 270 프래그먼트 인자 276 상세 내역 화면에 보여줄 Crime 객체를 LiveData 변환으로 얻기 280 데이터베이스 변경하기 285 궁금증 해소하기: 프래그먼트 인자를 사용하는 이유는 289 챌린지: 효율적으로 RecyclerView를 다시 로드하기 290 Chapter 13 대화상자 291 DialogFragment 생성하기 292 두 프래그먼트 간의 데이터 전달하기 296 챌린지: 더 많은 대화상자 만들기 303 Chapter 14 앱 바 305 AppCompat의 기본 앱 바 306 메뉴 308 안드로이드 애셋 스튜디오 사용하기 316 궁금증 해소하기: 앱 바 vs 액션 바 vs 툴바 320 궁금증 해소하기: AppCompat 앱 바 사용하기 321 챌린지: 텅 빈 뷰를 갖는 RecyclerView 322 Chapter 15 암시적 인텐트 323 버튼 추가하기 324 모델 계층에 용의자 추가하기 326 포맷 문자열 사용하기 328 암시적 인텐트 사용하기 330 챌린지: 또 다른 암시적 인텐트 343 Chapter 16 인텐트를 사용한 사진 찍기 345 사진을 위한 장소 345 파일 스토리지 349 카메라 인텐트 사용하기 354 비트맵의 크기 조정과 보여주기 358 사용하는 장치 기능 선언하기 363 챌린지: 사진을 확대해서 보여주기 363 챌린지: 섬네일 이미지 효율적으로 로드하기 364 Chapter 17 지역화 365 리소스 지역화하기 366 구성 수식자 373 대체 리소스 테스트하기 379 궁금증 해소하기: 장치 크기 결정하기 380 챌린지: 날짜를 지역화하기 380 Chapter 18 접근성 381 TalkBack 381 텍스트가 없는 요소를 TalkBack이 읽을 수 있게 만들기 387 대등한 사용자 경험 만들기 391 궁금증 해소하기: 접근성 검사기 사용하기 393 챌린지: 범죄 리스트 접근성 개선하기 396 Chapter 19 데이터 바인딩과 MVVM 397 다른 아키텍처가 왜 필요할까? 398 MVVM 뷰모델 vs Jetpack ViewModel 398 BeatBox 생성하기 399 단순 데이터 바인딩 구현하기 400 애셋 가져오기 405 애셋 사용하기 407 애셋 사용 코드 추가하기 409 데이터 바인딩하기 412 궁금증 해소하기: 데이터 바인딩 추가로 알아보기 420 궁금증 해소하기: LiveData와 데이터 바인딩 423 Chapter 20 단위 테스트와 오디오 재생 425 SoundPool 생성하기 426 애셋 사용하기 426 음원 로드하기 427 음원 재생하기 429 테스트 라이브러리 의존성 추가하기 430 테스트 클래스 생성하기 431 테스트 설정하기 433 테스트 작성하기 434 데이터 바인딩 콜백 441 음원 내리기 442 궁금증 해소하기: 통합 테스트 444 궁금증 해소하기: 모의 객체와 테스트 446 챌린지: 재생 속도 제어하기 447 챌린지: 장치 방향 전환 시에도 음원 재생하기 447 Chapter 21 스타일과 테마 449 색상 리소스 450 스타일 450 테마 453 앱 테마 색상 변경하기 456 테마 속성 오버라이드하기 458 버튼 속성 변경하기 462 궁금증 해소하기: 테마 속성 사용하기 466 Chapter 22 XML drawable 467 균일한 버튼 만들기 467 형태 drawable 469 상태 리스트 drawable 470 레이어 리스트 drawable 472 궁금증 해소하기: XML drawable을 사용해야 하는 이유 474 궁금증 해소하기: Mipmap 이미지 474 궁금증 해소하기: 9-패치 이미지 476 챌린지: 버튼 테마 482 Chapter 23 인텐트와 태스크 483 NerdLauncher 생성하기 484 암시적 인텐트 해결하기 486 런타임 시에 명시적 인텐트 생성하기 492 태스크와 Back 스택 494 NerdLauncher를 홈 화면으로 사용하기 499 궁금증 해소하기: 프로세스 vs 태스크 501 궁금증 해소하기: 동시 문서 504 챌린지: 앱 아이콘 사용하기 506 Chapter 24 HTTP와 백그라운드 태스크 507 PhotoGallery 생성하기 508 Retrofit을 사용한 네트워킹 513 플리커에서 JSON 가져오기 525 구성 변경 시의 네트워크 요청 535 RecyclerView에 응답 결과 보여주기 539 궁금증 해소하기: 다른 파서와 데이터 형식 540 궁금증 해소하기: 요청 취소하기 541 챌린지: 커스텀 Gson 역직렬화 클래스 구현하기 542 챌린지: 페이징 543 챌린지: 열의 개수를 동적으로 조정하기 544 Chapter 25 Looper, Handler, HandlerThread 545 이미지를 보여주기 위해 RecyclerView 준비하기 545 URL로부터 이미지 내려받기 준비하기 548 내려받기 관련 고려 사항 550 백그라운드 스레드 만들기 551 메시지와 메시지 핸들러 557 뷰 생명주기 리스닝하기 570 유보 프래그먼트 573 궁금증 해소하기: 이미지 내려받기 문제 해결하기 577 궁금증 해소하기: StrictMode 578 챌린지: 프리로딩과 캐싱 579 Chapter 26 SearchView와 공유 프리퍼런스 581 플리커 검색하기 582 SearchView 사용하기 587 공유 프리퍼런스를 사용한 간단한 데이터 보존 592 앱 다듬기 597 챌린지: 한번 더 다듬기 598 Chapter 27 WorkManager 599 Worker 생성하기 600 작업 스케줄링하기 601 새로운 사진 확인하기 604 사용자에게 알림 보여주기 608 폴링의 사용자 제어 제공하기 613 Chapter 28 브로드캐스트 인텐트 619 일반 인텐트 vs 브로드캐스트 인텐트 619 포그라운드 알림 차단하기 620 수신자와 오래 실행되는 태스크 634 궁금증 해소하기: 로컬 이벤트 634 궁금증 해소하기: 브로드캐스트 수신자의 제약 637 Chapter 29 웹과 WebView의 브라우징 639 플리커 데이터에서 하나 더 알아둘 사항 640 쉬운 방법: 암시적 인텐트 641 더 어려운 방법: WebView 643 WebView 사용 시의 장치 회전 처리 652 궁금증 해소하기: 자바스크립트 객체 주입하기 654 궁금증 해소하기: WebView 업데이트 655 궁금증 해소하기: 크롬 커스텀 탭(또 다른 쉬운 방법) 655 챌린지: 브라우저 검색 기록에 백 버튼 사용하기 658 Chapter 30 커스텀 뷰와 터치 이벤트 659 DragAndDraw 프로젝트 설정하기 660 커스텀 뷰 생성하기 660 터치 이벤트 처리하기 663 onDraw(Canvas) 내부에서 렌더링하기 667 궁금증 해소하기: GestureDetector 670 챌린지: 상태 정보 저장하기 670 챌린지: 박스의 방향 회전 671 Chapter 31 속성 애니메이션 673 장면 생성하기 673 간단한 속성 애니메이션 676 여러 애니메이터를 함께 사용하기 685 궁금증 해소하기: 다른 애니메이션 API 686 챌린지 687 Chapter 32 책을 마무리하며 689 마지막 챌린지 689 부담 없는 연락처 690 감사 인사 690 |
Kristin Marsicano
Brian Gardner
Bill Phillips
Chris Stewart
심재철의 다른 상품
|
안드로이드 앱은 고유한 패키지 이름을 가져야한다. 앱이 설치되거나 배포되는 각 장치나 구글 플레이 스토어(Google Play Store)에서 식별이 가능해야 하기 때문이다. 따라서 이름 충돌 가능성을 미연에 방지하기 위해 각자의 인터넷 도메인 이름을 뒤집어서 사용하는 것이 좋지만, 어떤 값을 입력하든 고유한 이름이면 된다.
--- p.5 하지만 프로세스가 종료되면 ViewModel이 처리하지 못한다. 자신이 가진 모든 것이 프로세스와 함께 메모리에서 완전히 제거되기 때문이다. SIS가 주목받는 이유가 바로 이 때문이다. 그런데 SIS에는 제약이 있다. SIS는 직렬화되어(serialized) 디스크에 저장되므로 크거나 복잡한 객체를 저장하는 것은 피해야 한다. --- p.101 데이터 바인딩 작업을 수행하는 모든 코드는 CrimeHolder 내부에 두는 것이 좋다. 이렇게 하려면 우선 바인딩되는 Crime 객체의 참조를 보존하는 속성을 추가하면 된다. 그리고 내친 김에 기존의 TextView 참조 속성(titleTextView와 dateTextView)들을 rivate으로 변경하고 bind(Crime) 함수를 CrimeHolder에 추가한다. 이 함수에서는 바인딩되는 Crime 객체의 참조를 새로 추가하는 속성에 보존하며, titleTextView와 dateTextView가 참조하는 TextView의 text 속성값을 현재 참조되는 Crime 객체의 속성값으로 설정한다. --- p.215 앱 바를 ‘툴바’ 또는 ’액션 바’라고 하는 얘기를 가끔 들을 것이다. 그리고 안드로이드 문서에서도 이 용어들을 혼용해서 사용한다. 하지만 앱 바, 액션 바, 툴바가 정말 같은 것일까? 이 용어들은 서로 관련이 있으나 정확하게 같은 것은 아니며, UI 설계 요소로는 ‘앱 바’라고 한다. --- p.320 LiveData와 데이터 바인딩은 데이터가 변경되는지 관찰하면서 변경될 때 반응하는 방법을 제공한다는 면에서 서로 유사하다. 실제로 LiveData와 데이터 바인딩을 같이 사용할 수 있다. 다음 코드에서는 Observable 대신 LiveData를 사용해서 title 속성을 SoundViewModel에 바인딩했다. 현재 프로젝트 코드를 변경하지 말고 참고만 하자. --- p.423 main 스레드는 여러 핸들러와 하나의 Looer를 갖는 메시지 루프다. main 스레드에서 Handler를 생성하면 이 핸들러는 main 스레드의 Looer와 연결되며, 그다음에 이 Handler를 다른 스레드에 전달한다. 그리고 전달된 Handler는 자신을 생성했던 스레드의 Looer와 계속 관계를 유지한다. 따라서 해당 Handler가 처리할 책임이 있는 모든 메시지는 main 스레드의 큐에서 처리된다. --- p.567 |
|
이 책의 대상 독자
-실무와 동일하게 프로젝트를 완성하면서 안드로이드 앱 개발을 위한 프로그래밍 기법을 배우고자 하는 입문자 -기본 안드로이드 앱 개발 지식은 있지만 실무에 적용할 수 있는 기법과 능력을 더 키우고 싶은 개발자 -안드로이드 고급 컴포넌트나 라이브러리(예: Jetpack)를 사용한 안드로이드 앱 개발 기법을 익히고자 하는 개발자 |