1부 천 리 길도 한 걸음부터
01장 _ 안드로이드 앱 개발 준비하기
1.1. 안드로이드 버전별 특징
1.2. 안드로이드 개발 준비
1.2.1. SDK 설치
1.2.2. 안드로이드 스튜디오 설치
02장 _ 첫 번째 앱 만들기
2.1. 안드로이드 프로젝트 만들기
2.1.1. 프로젝트 생성
2.1.2. 대상 기기 및 SDK 선택
2.1.3. 화면 구성 선택
2.1.4. 액티비티 생성
2.2. 프로젝트 구성
2.2.1. app 부분 살펴보기
2.2.2. Gradle Scripts 부분 살펴보기
2.3. 그레이들 빌드 시스템
2.3.1. 프로젝트 수준 build.gradle
2.3.2. 모듈 수준 build.gradle
2.4. 앱 실행
2.4.1. 실제 기기로 실행
2.4.2. 에뮬레이터로 실행
2.4.3. 안드로이드 스튜디오에서 앱 실행
03장 _ 뷰와 뷰그룹
3.1. 뷰와 뷰그룹
3.1.1. 뷰(View)
3.1.2. 뷰그룹(ViewGroup)
3.2. 레이아웃 기초
3.2.1. XML 작성
3.2.2. XML 리소스 로딩
3.2.3. 속성(attribute)
3.2.4. 여백 다루기 : 패딩과 마진
3.3. 간단한 사용자 인터페이스 구성
3.3.1. LinearLayout 만들기
3.3.2. 문자열 입력 필드 추가
3.3.3. 문자열 리소스 추가
3.3.4. 버튼 추가
3.4. 인텐트 : 다른 액티비티 실행
3.4.1. 버튼 클릭
3.4.2. 인텐트 작성
3.4.3. 두 번째 액티비티 만들기
04장 _ 자주 사용하는 뷰, 유용한 뷰
4.1. 자주 사용하는 뷰
4.1.1. 모듈 작성하기
4.1.2. 모든 뷰의 근간 : View
4.1.3. 텍스트를 표시하자 : TextView
4.1.4. 사용자 입력을 받자 : EditText
4.1.5. 이미지를 표시하자 : ImageView
4.1.6. 버튼을 달자 : Button
4.2. 기타 유용한 뷰
4.2.1. CheckBox
4.2.2. RadioButton
4.2.3. RatingBar
4.2.4. Switch
4.2.5. SeekBar
4.2.6. SearchView
4.2.7. ProgressBar
05장 _ 레이아웃: 화면에 뷰를 수놓는 방법
5.1. LinearLayout (선형 레이아웃)
5.1.1. orientation 속성
5.1.2. layout_weight 속성
5.1.3. gravity 속성
5.2. RelativeLayout (상대 레이아웃)
5.2.1. 부모 뷰를 기준으로 배치
5.2.2. 특정 뷰를 기준으로 배치
5.3. FrameLayout (프레임 레이아웃)
5.4. ConstraintLayout (제약 레이아웃)
5.4.1. 사용 준비
5.4.2. 레이아웃 변환
5.4.3. 새로운 레이아웃 추가
5.4.4. 제약 추가(디자인 모드에서)
5.4.5. 제약 추가(텍스트 모드에서)
06장 _ 안드로이드는 액티비티로부터
6.1. 안드로이드의 4대 구성요소
6.2. 화면은 곧 액티비티다
6.2.1. 메인 액티비티
6.2.2. 액티비티 생성하기
6.3. 액티비티 상속의 변천사와 AppCompatActivity
6.4. 액티비티끼리 데이터 주고받기
따라 해 보세요 _ 액티비티끼리 데이터 주고받기
07장 _ 인텐트와 인텐트 필터
7.1. 인텐트 사용방법
7.2. 명시적 인텐트와 암시적 인텐트
7.2.1. 명시적 인텐트
7.2.2. 암시적 인텐트
7.2.3. 인텐트 필터
7.3. 전화 걸기 앱 만들기 : 암시적 인텐트 사용
따라 해 보세요 _ 전화 걸기 앱 만들기
7.4. 암시적 인텐트를 사용하는 다양한 예
7.5. 카카오톡에 메시지 전달하기
따라 해 보세요 _ 카카오톡에 메시지 전달하기
08장 _ 메뉴 구현하기
8.1. 액션바(ActionBar)
8.1.1. 액션바 가져오기
8.1.2. 업(Up) 내비게이션 제공하기
8.1.3. 효과적인 탐색 구현
따라 해 보세요 _ 앱 내 탐색 구현해보기
8.2. 옵션 메뉴
따라 해 보세요 _ 옵션 메뉴 사용하기
09장 _ 웹뷰: 웹 페이지 표시하기
9.1. 나만의 웹 브라우저 만들기
따라 해 보세요 _ 웹 브라우저 만들기
9.2. 웹 브라우저 보완하기
9.2.1. 인터넷 권한 설정
9.2.2. 뒤로 가기 재정의
9.2.3. 소프트 키보드 재정의
9.2.4. 뷰 숨기기
9.2.5. 키보드 숨기기
9.2.6. 뒤로 가기, 앞으로 가기, 새로 고침 메뉴 작성
9.2.7. 아이콘 제작 : 벡터 에셋
10장 _ 화면 제약을 극복하는 방법
10.1. 스크롤뷰(ScrollView)
따라 해 보세요 _ 스크롤뷰 사용하기
10.2. 리스트뷰(ListView)와 그리드뷰(GridView)
10.3. 어댑터뷰(AdapterView)
따라 해 보세요 _ 어댑터뷰 사용하기
10.4. 나만의 어댑터 만들기 : BaseAdapter
10.5. 리스트뷰의 성능 최적화 : 뷰홀더 패턴
11장 _ 기기에 데이터 저장하기: SharedPreference
11.1. 데이터를 저장하는 간단한 앱
따라 해 보세요 _ 이메일 기억하기 기능
11.2. 기기에 설치된 앱의 정보 이용
따라 해 보세요 _ 바로가기 추가와 유지하기
11.2.1. SharedPreference에 앱 정보 저장하기
11.2.2. SharedPreference에 저장된 값 불러오기
11.3. 다이얼로그 추가하기
11.3.1. 뒤로 가기 키 재정의
11.3.2. 확인/취소 버튼 추가하기
12장 _ 액티비티 생명주기
12.1. 여러 액티비티의 관리
12.2. 액티비티 생명주기 소개
12.3. 생명주기 콜백 메서드
12.3.1. 일시 정지 및 재개
12.3.2. 정지 및 재실행
12.3.3. 깅제 종료 및 실행
12.4. 화면 회전에도 끄떡없게 만들기
12.4.1. 화면 회전 시 초기화되는 상태
따라 해 보세요 _ 화면 회전에 대응하기
12.4.2. 상태 저장
12.4.3. 상태 복원
12.5. 화면 회전 막기
12.6. 다중 창 막기
13장 _ 프래그먼트: 화면을 조각조각 나누기
13.1. 프래그먼트 소개
13.1.1. 프래그먼트와 액티비티의 차이점
13.1.2. 프래그먼트를 사용하기 위한 화면 설계
13.1.3. 프래그먼트의 관리
13.2. 프래그먼트 실습
13.2.1. 프래그먼트 생성
따라 해 보세요 _ 프래그먼트 실습
13.2.2. 프래그먼트에 기능 추가
13.2.3. 프래그먼트 교체, 삭제, 추가
13.3. 다이얼로그 프래그먼트(DialogFragment)
13.3.1. AlertDialog의 생명주기
13.3.2. 다이얼로그 프래그먼트 생성
13.3.3. 다이얼로그 프래그먼트 표시
13.4. 프래그먼트와 액티비티 간의 통신(콜백 구현하기)
따라 해 보세요 _ 콜백 구현하기
13.4.1. 색상 목록을 표시하는 프래그먼트 작성
13.4.2. 색상을 표시하는 프래그먼트 작성
13.4.3. 콜백 인터페이스 정의
13.4.4. 콜백 인터페이스 구현
14장 _ 뷰페이저: 좌우로 밀리는 화면
14.1. 뷰페이저 구현 실습
따라 해 보세요 _ 좌우로 밀리는 화면 만들기
14.1.1. 프래그먼트 생성
14.1.2. 뷰페이저용 어댑터 작성
14.2. 탭 레이아웃(TabLayout)과 연동
14.2.1. 탭 레이아웃 사용 준비
14.2.2. 뷰페이저와 탭 레이아웃 연동
15장 _ 환경에 따라 화면 구성하기
15.1. 리소스 분기
15.2. 유연한 사용자 인터페이스 구축
15.2.1. 프로젝트 생성 및 샘플 데이터 준비
따라 해 보세요 _ 기사와 기사 내용 표시 앱
15.2.2. 화면이 작은 기기에서의 동작
15.2.3. 화면이 큰 기기를 위한 구현 추가
16장 _ 리소스
16.1. 리소스 개요
16.2. Drawable 리소스 : 늘어나는 말풍선 만들기
16.2.1. 비트맵 파일
16.2.2. 나인패치(9 patch)
16.2.3. 예제 실행
16.3. 언어 현지화(Localization) : 외국어 지원하기
따라 해 보세요 _ 외국어 지원하기
16.3.1. 직접 리소스를 추가하는 방법
16.3.2. 번역 편집기를 이용한 방법
16.3.3. 텍스트 리소스를 텍스트 뷰에 적용
16.3.4. 현지화 텍스트 확인
16.3.5. 텍스트 방향에 따른 현지화 처리
17장 _ 브로드캐스트 리시버
17.1. 미리 정의된 방송
17.1.1. 글로벌 방송 수신
따라 해 보세요 _ 전원이 열결되면 알리기
17.1.2. 로컬 방송 수신
17.2. 사용자 정의 방송
17.2.1. 나만의 방송 보내기
17.2.2. 나만의 방송 수신하기
17.3. 브로드캐스트 리시버의 특징
18장 _ 콘텐트 프로바이더
18.1. 콘텐트 프로바이더 소개
18.1.1. 프로바이더 사용 방법
18.1.2. 콘텐트 프로바이더 URI 목록
18.2. 프로바이더 사용을 위한 스레드 이해
18.3. 커서어댑터(CursorAdapter) 구현 예
따라 해 보세요 _ 갤러리 앱 만들기
18.3.1. Glide 라이브러리 사용
18.3.2. 그리드뷰 꾸미기
18.3.3. 그리드뷰의 아이템 클릭 이벤트 처리
19장 _ 비동기 처리
19.1. 작업 스레드와 메인 스레드
19.2. 스레드와 핸들러
따라 해 보세요 _ 다운로드 진행률 표시하기
19.2.1. 스레드와 핸들러 조합의 사용 예
19.2.2. 핸들러의 대표 메서드
19.2.3. 기타 핸들러 기능
19.3. AsyncTask
19.3.1. AsyncTask의 제네릭 타입
19.3.2. AsyncTask 작성의 4단계
19.3.3. 스레드, 핸들러를 AsyncTask로 변경
19.3.4. AsyncTask의 스레딩 규칙
19.3.5. 실행 순서
19.3.6. 태스크의 동작 취소
19.4. 카운트다운 타이머 예제 작성
따라 해 보세요 _ 카운트다운 타이머 만들기
20장 _ DB를 이용한 데이터 저장과 공유
20.1. 데이터베이스 기본부터 튼튼히
따라 해 보세요 _ DB 활용 간단한 메모장 만들기
20.1.1. 스키마 정의
20.1.2. 계약(Contract) 클래스 작성
20.1.3. SQL 헬퍼 클래스 생성
20.1.4. 헬퍼 클래스에 싱글턴 패턴 적용
20.1.5. DB의 정보 읽어오기
20.1.6. DB에 정보 삽입
20.1.7. DB에서 정보 삭제
20.1.8. DB의 정보 수정
20.2. 메모장 앱 만들면서 SQLite 익히기
20.2.1. 버튼부터 달아보자
20.2.2. 메모 작성 화면을 추가하고 버튼에 연결하기
20.2.3. DB에 저장하고 목록으로 보여주기
20.2.4. 메모를 내림차순으로 정렬하기
20.2.5. 저장된 메모를 확인하고 수정과 삭제까지
21장 _ 콘텐트 프로바이더와 로더
21.1. 프로바이더에 살며시 접근해보자
21.1.1. 데이터의 위치를 나타내는 콘텐트 URI
21.1.2. URI 패턴 분석을 돕는 UriMatcher 클래스
21.1.3. MIME 타입
21.2. 콘텐트 프로바이더 만들기
21.2.1. onCreate( ) : MemoDbHelper 객체 초기화
21.2.2. getType( ) : MIME 타입 반환
21.2.3. delete( ) : 메모 삭제 시 처리
21.2.4. insert( ) : 메모 추가
21.2.5. query( ) : 데이터 질의
21.2.6. update( ) : 업데이트
21.3. 콘텐트 프로바이더 적용하기
21.4. 로더(Loader) 맛보기
21.4.1. 로더 준비하기
21.4.2. 로더 구현하기
21.4.3. 프로바이더 수정
21.4.4. 로더에서 불필요한 로직 제거
22장 _ 네트워크 통신
22.1. 자바 기반 전통적 HTTP 통신
22.2. 외부 라이브러리를 활용한 편리한 통신
22.2.1. OkHttp 라이브러리 사용 준비
따라 해 보세요 _ 네트워크 통신 해보기(OkHttp 라이브러리 활용)
22.2.2. OkHttp 라이브러리 적용
22.3. JSON 파싱
22.3.1. JSON 데이터 파싱의 기본
22.3.2. JSON 데이터 주무르기
22.4. 실제 날씨 데이터 이용하기 : 웹 API 활용
22.4.1. 요청 방식
22.4.2. 응답
22.4.3. 인증
22.4.4. 실제 날씨 데이터를 얻는 방법
23장 _ 서비스 컴포넌트
23.1. 서비스가 필요한 이유
따라 해 보세요 _ 앱 종료 후 멈출 수 없는 스레드 예
23.2. 서비스 사용하기
23.2.1. 스타트 서비스
따라 해 보세요 _ 서비스 컴포넌트 예제
23.2.2. 인텐트 서비스
23.2.3. 죽지 않는 서비스
23.3. 바인드 서비스
23.3.1. 바인드 서비스 작성
23.3.2. ServiceConnection 객체 정의
23.3.3. 바인딩 상태 확인
23.3.4. 바인드 서비스의 기능 사용
23.4. 서비스의 생명주기
24장 _ 알림과 알람 매니저
24.1. 알림 띄우기
24.1.1. 알림 디자인 변천사
24.1.2. 알림의 구성요소
24.1.3. 알림 생성 방법
따라 해 보세요 _ 알림 띄우기
24.1.4. 안드로이드 오레오에서 달라진 점
24.2. 알람 매니저(AlarmManager)
24.2.1. 알람 매니저 특징
24.2.2. 알람 매니저 실습 : 타임 피커 활용
따라 해 보세요 _ 지정된 시간 후 앱 실행
25장 _ 지도를 이용해보자
25.1. 안드로이드 앱에 지도 추가
따라 해 보세요 _ 지도 표시하기
25.1.1. 구글 지도 API 키 발급받기
25.1.2. 구글 맵 액티비티 템플릿 코드 살펴보기
25.1.3. 마커의 타이틀 클릭 이벤트
25.2. 실행 중(Runtime) 권한 체크
25.2.1. 권한 승인 단계의 변화
25.2.2. 권한 확인, 요청, 응답 처리
25.2.3. 현재 위치 정보 얻기
25.2.4. 런타임 권한 체크 구현
25.2.5. 디버그 키와 릴리즈 키
26장 _ 이벤트 처리와 분위기 변신
26.1. 공통 이벤트
따라 해 보세요 _ 다양한 이벤트 처리 예
26.1.1. 레이아웃 코드 작성
26.1.2. 액티비티 코드 작성
26.1.3. 클릭 이벤트
26.1.4. 포커스 이동 이벤트
26.1.5. 키 이벤트
26.1.6. 터치 이벤트
26.2. 이벤트 처리를 위한 4가지 구현 패턴
26.2.1. onClick 속성 이용
26.2.2. setOn ~ Listener 메서드에 이벤트 리스너 구현
26.2.3. 액티비티에서 이벤트 구현
26.2.4. 이벤트 리스너 구현 후 각 뷰의 리스너로 설정
26.3. 분위기 변신
26.3.1. 테마 변경
26.3.2. 나만의 토스트 만들기
따라 해 보세요 _ 나만의 스타일로 토스트 만들기
27장 _ 툴바 사용하기
27.1. 툴바(ToolBar)
따라 해 보세요 _ 툴바 사용하기
27.2. 툴바 꾸미기
27.3. 툴바에 검색 창(SearchView) 넣기
28장 _ 리사이클러뷰
28.1. 리사이클러뷰 소개
28.2. 리사이클러뷰 + 카드뷰 사용하기
따라 해 보세요 _ 리사이클러뷰 + 카드뷰 사용하기
28.3. 클릭 이벤트 처리
28.4. 애니메이션 618
29장 _ 머티리얼 디자인
29.1. 아래로 당겨서 로딩하기
29.1.1. SwipeRefreshLayout 구현
따라 해 보세요 _ 아래로 당겨서 로딩하기
29.1.2. 로딩 상태 종료를 위한 리스너 구현
29.2. 내비게이션 드로어 메뉴
따라 해 보세요 _ 옆에서 나타나는 메뉴 만들기
29.2.1. Navigation Drawer Activity 레이아웃 분석
29.2.2. 메뉴의 이벤트 처리
29.3. 플로팅 액션 버튼
29.4. 스낵바
29.5. 코디네이터 레이아웃
29.5.1. 스크롤링 액티비티 살펴보기
29.5.2. ScrollingActivity 레이아웃 분석
29.5.3. 많이 사용하는 패턴
29.5.4. CoordinatorLayout과 Behavior
30장 _ 단위 테스트와 생산성을 높이는 라이브러리
30.1. 단위(Unit) 테스트
30.1.1. 계산기 클래스 작성하기
30.1.2. 테스트 수행해 보기
30.2. 생산성을 높이는 라이브러리
30.2.1. 메모리 누수를 검출하는 LeakCanary
30.2.2. 로컬 DB를 쉽게 확인하는 Stetho
30.2.3. 이벤트 전달을 쉽게 하는 EventBus
30.2.4. 부드러운 이미지 로딩 Glide
30.2.5. JSON 처리는 Gson
30.2.6. 비동기 네트워크 통신 OkHttp
30.2.7. OkHttp와 Gson 조합은 Retrofit
30.2.8. 둥근 이미지 뷰 CircleImageView
30.2.9. 모바일용 데이터베이스 Realm
따라 해 보세요 _ Realm을 이용한 회원가입 기능 구현
31장 _ 파이어베이스(Firebase)
31.1. 파이어베이스란?
31.1.1. 개발자 콘솔
31.1.2. 안드로이드 프로젝트에 파이어베이스 사용 조건
31.2. 앱 분석(Analytics)
31.3. 인증(Authentication)
31.3.1. 앱에 파이어베이스 인증 추가
31.3.2. 인증 처리
31.4. 실시간 데이터베이스(Realtime Database)
31.4.1. 앱에 파이어베이스 데이터베이스 추가
31.4.2. DatabaseReference 가져오기
31.4.3. 데이터베이스에 쓰기
31.5. 저장소(Storage)
31.5.1. 저장소 사용 준비
31.5.2. 파일 업로드
31.6. 알림(FCM)
31.6.1. 콘솔에서 메시지 전송
31.6.2. 알림 수신 및 처리
31.7. 원격 구성(Remote Config)
31.7.1. 원격 구성의 기본 설정
31.7.2. 원격 구성 값 가져오기
31.8. 기타 서비스들
32장 _ 채팅 앱 만들기: 파이어베이스 활용
32.1. 프로젝트 생성하기
32.2. 레이아웃 작성하기
32.3. 모델 클래스 작성하기
32.4. 뷰홀더 클래스 작성하기
32.5. 파이어베이스 연결하기
32.6. 실시간 데이터베이스 사용하기
32.6.1. 메시지 전송하기
32.6.2. 메시지 읽어오기
32.7. 푸시 알림 보내기 : FCM 활용
32.8. 원격 구성으로 메시지 길이 제한 적용하기
32.9. 앱 초대하기
32.10. 분석하기
32.11. 버그 리포팅 받기
33장 _ 미세먼지 정보 앱 만들기
33.1. 어떤 앱을 만들 것인가?
33.2. 프로젝트 구성 및 설계
33.3. 레이아웃
33.4. 미세먼지 APP 키 발급 받기
33.5. Retrofit으로 미세먼지 정보 가져오기
33.5.1. 모델 클래스 작성
33.5.2. Retrofit 사용 준비
33.5.3. 데이터 제공을 추상화하기
33.5.4. 프래그먼트 작성하기
33.6. 현재 위치 가져오기
33.7. 지역 추가 다이얼로그 작성
33.8. 지역명을 위도 경도로 변환하기
33.9. 액티비티에서 코드 마무리하기
33.10. Realm 데이터베이스 적용
33.10.1. Realm 사용 준비
33.10.2. 저장과 로드 구현하기
33.11. 내비게이션 드로어
부록