第1章 Android简介 1
1.1 简介 2
1.2 Android――世界领先的移动操作系统 2
1.3 Android的特点 3
1.4 Android操作系统 5
1.4.1 Android 2.2 (Froyo) 5
1.4.2 Android 2.3 (Gingerbread) 6
1.4.3 Android 3.0~3.2 (Honeycomb) 6
1.4.4 Android 4.0~4.0.4 (Ice Cream Sandwich) 6
1.4.5 Android 4.1~4.3 (Jelly Bean) 7
1.4.6 Android 4.4 (KitKat) 8
1.4.7 Android 5.0和5.1 (Lollipop) 8
1.4.8 Android 6 (Marshmallow) 9
1.5 从Google Play下载应用 9
1.6 包 10
1.7 Android软件开发工具集(SDK) 11
1.8 面向对象编程:简短回顾 13
1.8.1 汽车作为对象 13
1.8.2 方法与类 13
1.8.3 实例化 14
1.8.4 复用 14
1.8.5 消息与方法调用 14
1.8.6 属性与实例变量 14
1.8.7 封装 14
1.8.8 继承 14
1.8.9 面向对象的分析与设计(OOAD) 14
1.9 在AVD中测试Tip Calculator应用 15
1.9.1 在Android Studio中打开Tip Calculator应用的工程 15
1.9.2 创建Android虚拟设备(AVD) 16
1.9.3 在Nexus 6 AVD中运行Tip Calculator应用 18
1.9.4 在Android设备上运行Tip Calculator应用 20
1.10 创建好的Android应用 21
1.11 Android开发资源 22
1.12 小结 23
第2章 Welcome应用 24
2.1 简介 25
2.2 技术概览 26
2.2.1 Android Studio 26
2.2.2 LinearLayout,TextView和ImageView 26
2.2.3 可扩展标记语言(XML) 26
2.2.4 应用的资源 26
2.2.5 辅助性 26
2.2.6 国际化 27
2.3 创建应用 27
2.3.1 启动Android Studio 27
2.3.2 创建新工程 27
2.3.3 Create New Project对话框 28
2.3.4 Target Android Devices步骤 28
2.3.5 Add an Activity to Mobile步骤 29
2.3.6 Customize the Activity步骤 30
2.4 Android Studio窗口 31
2.4.1 Project窗口 31
2.4.2 编辑器窗口 32
2.4.3 Component Tree窗口 33
2.4.4 应用的资源文件 33
2.4.5 布局编辑器 33
2.4.6 默认GUI 33
2.4.7 默认GUI的XML 34
2.5 用布局编辑器构建应用的GUI 35
2.5.1 向工程添加图像 35
2.5.2 添加应用图标 36
2.5.3 将RelativeLayout 改成LinearLayout 37
2.5.4 改变LinearLayout的id和orientation属性 38
2.5.5 配置TextView的id和text属性 39
2.5.6 配置TextView的textSize属性 40
2.5.7 设置TextView的textColor属性 41
2.5.8 设置TextView的gravity属性 41
2.5.9 设置TextView的layout:gravity属性 41
2.5.10 设置TextView的layout:weight属性 43
2.5.11 添加ImageView,显示图像 43
2.5.12 预览设计的效果 46
2.6 运行Welcome应用 46
2.7 为应用增加辅助功能 48
2.8 使应用国际化 49
2.8.1 本地化 49
2.8.2 为本地化资源命名文件夹 49
2.8.3 将字符串译文添加到工程中 49
2.8.4 本地化字符串 50
2.8.5 在AVD中测试西班牙语的应用 50
2.8.6 在设备中测试西班牙语的应用 51
2.8.7 TalkBack与本地化 51
2.8.8 本地化清单 52
2.8.9 专业翻译 52
2.9 小结 52
第3章 Tip Calculator应用 53
3.1 简介 54
3.2 测试驱动的Tip Calculator应用 55
3.3 技术概览 56
3.3.1 Activity类 56
3.3.2 Activity类的生命周期方法 56
3.3.3 AppCompat库与AppCompatActivity类 57
3.3.4 安排GridLayout中的视图 57
3.3.5 利用布局编辑器、Component Tree和Properties窗口创建并定制GUI 58
3.3.6 格式化数字,表示本地货币和百分比字符串 58
3.3.7 实现TextWatcher接口,处理EditText中的文本变化 58
3.3.8 实现OnSeekBarChangeListener接口,处理SeekBar中的滑块位置变化 58
3.3.9 材料主题 58
3.3.10 材料设计:高度和阴影 59
3.3.11 材料设计:颜色 59
3.3.12 AndroidManifest.xml 60
3.3.13 在Properties窗口中搜索 60
3.4 构建GUI 60
3.4.1 GridLayout简介 60
3.4.2 创建TipCalculator工程 61
3.4.3 改成GridLayout布局 61
3.4.4 添加TextView,EditText和SeekBar 62
3.4.5 定制视图 64
3.5 默认主题及定制主题颜色 66
3.5.1 parent主题 66
3.5.2 定制主题颜色 67
3.5.3 样式的常用View属性值 70
3.6 添加应用的逻辑功能 70
3.6.1 package声明和import声明 70
3.6.2 AppCompatActivity的MainActivity子类 71
3.6.3 类变量与实例变量 71
3.6.4 重写Activity方法onCreate 72
3.6.5 MainActivity方法calculate 74
3.6.6 实现OnSeekBarChangeListener接口的匿名内部类 74
3.6.7 实现TextWatcher接口的匿名内部类 75
3.7 AndroidManifest.xml 76
3.7.1 manifest元素 77
3.7.2 application元素 77
3.7.3 activity元素 77
3.7.4 intent-filter元素 78
3.8 小结 79
第4章 Flag Quiz应用 80
4.1 简介 81
4.2 测试驱动的Flag Quiz应用 83
4.2.1 配置应用的设置 83
4.2.2 运行应用 84
4.3 技术概览 86
4.3.1 菜单 86
4.3.2 Fragment 86
4.3.3 Fragment生命周期方法 87
4.3.4 管理Fragment 88
4.3.5 首选项 88
4.3.6 assets文件夹 88
4.3.7 资源文件夹 89
4.3.8 支持不同屏幕尺寸和分辨率 89
4.3.9 确定设备方向 90
4.3.10 用于显示消息的Toast 90
4.3.11 使用Handler在未来执行一个Runnable对象 90
4.3.12 将动画用于View 90
4.3.13 使用ViewAnimationUtils创建环形缩放动画 90
4.3.14 通过颜色状态表根据视图状态确定颜色 90
4.3.15 AlertDialog 91
4.3.16 为异常消息做日志 91
4.3.17 通过显示Intent启动另一个活动 91
4.3.18 Java数据结构 92
4.3.19 Java SE 7特性 92
4.3.20 AndroidManifest.xml 93
4.4 创建工程、资源文件和另外的类 93
4.4.1 创建工程 93
4.4.2 Blank Activity模板布局 94
4.4.3 配置对Java SE 7的支持 94
4.4.4 向工程添加国旗图像 95
4.4.5 strings.xml与格式化字符串资源 95
4.4.6 arrays.xml 96
4.4.7 colors.xml 97
4.4.8 button_text_color.xml 98
4.4.9 编辑menu_main.xml 98
4.4.10 创建国旗飘扬动画 99
4.4.11 指定应用设置的preferences.xml 100
4.4.12 添加SettingsActivity类和SettingsActivityFragment类 101
4.5 构建应用的GUI 102
4.5.1 用于纵向模式设备的activity_main.xml布局 102
4.5.2 设计fragment_main.xml布局 102
4.5.3 Graphical Layout编辑器工具栏 106
4.5.4 用于横向设备的content_main.xml布局 107
4.6 MainActivity类 108
4.6.1 package声明和import声明 109
4.6.2 字段 109
4.6.3 重写的Activity方法onCreate 109
4.6.4 重写的Activity方法onStart 111
4.6.5 重写的Activity方法onCreateOptionsMenu 112
4.6.6 重写的Activity方法onOptionsItemSelected 112
4.6.7 实现OnSharedPreferenceChangeListener的匿名内部类 113
4.7 MainActivityFragment类 114
4.7.1 package声明和import声明 114
4.7.2 字段 114
4.7.3 重写的Fragment方法onCreateView 116
4.7.4 updateGuessRows方法 118
4.7.5 updateRegions方法 118
4.7.6 resetQuiz方法 119
4.7.7 loadNextFlag方法 120
4.7.8 getCountryName方法 122
4.7.9 animate方法 122
4.7.10 实现OnClickListener的匿名内部类 123
4.7.11 disableButtons方法 126
4.8 SettingsActivity类 126
4.9 SettingsActivityFragment类 127
4.10 AndroidManifest.xml 127
4.11 小结 129
第5章 Doodlz应用 130
5.1 简介 131
5.2 在AVD中测试Doodlz应用 132
5.3 技术概览 135
5.3.1 Activity和Fragment的生命周期方法 135
5.3.2 定制视图 136
5.3.3 使用SensorManager监听加速计事件 136
5.3.4 定制的DialogFragment 136
5.3.5 使用Canvas,Paint和Bitmap画图 137
5.3.6 处理多点触事件并在Path中保存线信息 137
5.3.7 保存图形 138
5.3.8 打印功能及Android支持库的PrintHelper类 138
5.3.9 Android 6.0的新许可模型 138
5.3.10 利用Gradle构建系统添加依赖性 138
5.4 创建工程和资源 138
5.4.1 创建工程 139
5.4.2 Gradle:向工程添加支持库 139
5.4.3 strings.xml 139
5.4.4 为菜单项导入材料设计图标 140
5.4.5 MainActivityFragment菜单 140
5.4.6 在AndroidManifest.xml中添加许可 142
5.5 构建应用的GUI 142
5.5.1 MainActivity的content_main.xml布局 142
5.5.2 MainActivityFragment的fragment_main.xml布局 143
5.5.3 ColorDialogFragment的fragment_color.xml布局 143
5.5.4 LineWidthDialogFragment的fragment_line_width.xml布局 145
5.5.5 添加EraseImageDialogFragment类 146
5.6 MainActivity类 146
5.7 MainActivityFragment类 147
5.7.1 package声明、import声明与字段 147
5.7.2 重写的Fragment方法onCreateView 148
5.7.3 onResume方法和enableAccelerometerListening方法 149
5.7.4 onPause方法和disableAccelerometerListening方法 150
5.7.5 用于处理加速计事件的匿名内部类 150
5.7.6 confirmErase方法 151
5.7.7 重写的Fragment方法onCreateOptionsMenu和onOptionsItemSelected 152
5.7.8 saveImage方法 153
5.7.9 重写的onRequestPermissionsResult方法 154
5.7.10 getDoodleView方法和setDialogOnScreen方法 155
5.8 DoodleView类 155
5.8.1 package声明和import声明 155
5.8.2 静态变量和实例变量 156
5.8.3 构造方法 156
5.8.4 重写的View方法onSizeChanged 156
5.8.5 clear, setDrawingColor,getDrawingColor,setLineWidth和getLineWidth方法 157
5.8.6 重写的View方法onDraw 158
5.8.7 重写的View方法onTouchEvent 158
5.8.8 touchStarted方法 159
5.8.9 touchMoved方法 160
5.8.10 touchEnded方法 161
5.8.11 saveImage方法 161
5.8.12 printImage方法 162
5.9 ColorDialogFragment类 163
5.9.1 重写的DialogFragment方法onCreateDialog 163
5.9.2 getDoodleFragment方法 165
5.9.3 重写的Fragment生命周期方法onAttach和onDetach 165
5.9.4 响应alpha, red, green和blue SeekBar事件的匿名内部类 165
5.10 LineWidthDialogFragment类 166
5.10.1 onCreateDialog方法 168
5.10.2 响应widthSeekBar事件的匿名内部类 168
5.11 EraseImageDialogFragment类 169
5.12 小结 170
第6章 Cannon Game应用 171
6.1 简介 172
6.2 测试驱动的Cannon Game应用 173
6.3 技术概览 173
6.3.1 使用res/raw资源文件夹 173
6.3.2 Activity和Fragment的生命周期方法 173
6.3.3 重写View方法onTouchEvent 174
6.3.4 用SoundPool和AudioManager添加声音 174
6.3.5 用Thread,SurfaceView和SurfaceHolder实现逐帧动画 174
6.3.6 简单的冲突检测 175
6.3.7 沉浸模式 175
6.4 构建应用的GUI和资源文件 175
6.4.1 创建工程 175
6.4.2 调整主题,删除应用标题和应用栏 175
6.4.3 strings.xml 176
6.4.4 颜色 176
6.4.5 为应用添加声音 176
6.4.6 添加MainActivityFragment类 176
6.4.7 编辑activity_main.xml 177
6.4.8 将CannonView添加到fragment_main.xml 177
6.5 应用中各个类的概述 178
6.6 Activity的MainActivity子类 178
6.7 Fragment的MainActivityFragment子类 179
6.8 GameElement类 180
6.8.1 实例变量与构造方法 181
6.8.2 update, draw和playSound方法 181
6.9 GameElement的Blocker子类 181
6.10 GameElement的Target子类 182
6.11 Cannon类 183
6.11.1 实例变量与构造方法 183
6.11.2 align方法 183
6.11.3 fireCannonball方法 184
6.11.4 draw方法 184
6.11.5 getCannonball和removeCannonball方法 185
6.12 GameElement的Cannonball子类 185
6.12.1 实例变量与构造方法 185
6.12.2 getRadius,collidesWith,isOnScreen和reverseVelocityX方法 186
6.12.3 update方法 187
6.12.4 draw方法 187
6.13 SurfaceView的CannonView子类 187
6.13.1 package声明和import声明 187
6.13.2 常量与实例变量 188
6.13.3 构造方法 189
6.13.4 重写View方法onSizeChanged 191
6.13.5 getScreenWidth,getScreenHeight和playSound方法 191
6.13.6 newGame方法 192
6.13.7 updatePositions方法 194
6.13.8 alignAndFireCannonball方法 195
6.13.9 showGameOverDialog方法 195
6.13.10 drawGameElements方法 196
6.13.11 testForCollisions方法 197
6.13.12 stopGame和releaseResources方法 197
6.13.13 实现SurfaceHolder.Callback方法 199
6.13.14 重写View方法onTouchEvent 199
6.13.15 CannonThread:使用Thread实现游戏的循环 200
6.13.16 hideSystemBars和showSystemBars方法 201
6.14 小结 202
第7章 WeatherViewer应用 203
7.1 简介 204
7.2 测试驱动的WeatherViewer应用 204
7.3 技术概览 205
7.3.1 Web服务 205
7.3.2 JSON与org.json包 206
7.3.3 调用REST Web服务的HttpUrlConnection 208
7.3.4 使用AsyncTask执行GUI线程以外的网络请求 208
7.3.5 ListView,ArrayAdapter与View-Holder模式 209
7.3.6 FloatingActionButton 210
7.3.7 TextInputLayout 210
7.3.8 Snackbar 210
7.4 构建应用的GUI和资源文件 210
7.4.1 创建工程 210
7.4.2 AndroidManifest.xml 211
7.4.3 strings.xml 211
7.4.4 colors.xml 211
7.4.5 activity_main.xml 212
7.4.6 content_main.xml 212
7.4.7 list_item.xml 213
7.5 Weather类 214
7.5.1 package声明、import声明与实例变量 214
7.5.2 构造方法 215
7.5.3 convertTimeStampToDay方法 216
7.6 WeatherArrayAdapter类 216
7.6.1 package声明和import声明 216
7.6.2 嵌套类ViewHolder 217
7.6.3 实例变量与构造方法 217
7.6.4 重写的ArrayAdapter方法getView 218
7.6.5 用于在独立线程中下载图像的AsyncTask子类 219
7.7 MainActivity类 221
7.7.1 package声明和import声明 221
7.7.2 实例变量 222
7.7.3 重写的Activity方法onCreate 222
7.7.4 dismissKeyboard方法和createURL方法 223
7.7.5 调用Web服务的AsyncTask子类 224
7.7.6 convertJSONtoArrayList方法 226
7.8 小结 227
第8章 Twitter Searches应用 228
8.1 简介 229
8.2 测试驱动的应用 230
8.2.1 添加一个搜索 230
8.2.2 查看搜索Twitter的结果 231
8.2.3 编辑搜索 232
8.2.4 共享搜索 233
8.2.5 删除搜索 234
8.2.6 滚动浏览保存的搜索 234
8.3 技术概览 234
8.3.1 将键/值对数据保存到SharedPreferences文件 234
8.3.2 隐式Intent和意图选择器 235
8.3.3 RecyclerView 235
8.3.4 RecyclerView.Adapter和RecyclerView.ViewHolder 236
8.3.5 RecyclerView.ItemDecoration 236
8.3.6 在AlertDialog中显示选项清单 236
8.4 构建应用的GUI和资源文件 236
8.4.1 创建工程 236
8.4.2 AndroidManifest.xml 237
8.4.3 添加RecyclerView库 237
8.4.4 colors.xml 237
8.4.5 strings.xml 237
8.4.6 arrays.xml 237
8.4.7 dimens.xml 238
8.4.8 添加Save按钮图标 238
8.4.9 activity_main.xml 238
8.4.10 content_main.xml 239
8.4.11 RecyclerView项的布局:list_item.xml 241
8.5 MainActivity类 242
8.5.1 package声明和import声明 242
8.5.2 MainActivity类 242
8.5.3 重写的Activity方法onCreate 243
8.5.4 TextWatcher事件处理器和updateSaveFAB方法 245
8.5.5 saveButton的OnClickListener接口 246
8.5.6 addTaggedSearch方法 247
8.5.7 实现View.OnClickListener,显示搜索结果的匿名内部类 247
8.5.8 实现View.OnLongClickListener的匿名内部类 248
8.5.9 shareSearch方法 250
8.5.10 deleteSearch方法 251
8.6 RecyclerView.Adapter的SearchesAdapter子类 252
8.6.1 package声明、import声明、实例变量和构造方法 252
8.6.2 RecyclerView.ViewHolder的嵌套ViewHolder子类 252
8.6.3 重写RecyclerView.Adapter方法 253
8.7 RecyclerView.ItemDecoration的ItemDivider 子类 254
8.8 Fabric:Twitter的新移动开发平台 255
8.9 小结 256
第9章 Address Book应用 257
9.1 简介 258
9.2 测试驱动的Address Book应用 260
9.2.1 添加联系人信息 260
9.2.2 查看联系人信息 260
9.2.3 编辑联系人信息 260
9.2.4 删除联系人信息 262
9.3 技术概览 262
9.3.1 用FragmentTransaction显示Fragment 262
9.3.2 在Fragment与宿主Activity之间交换数据 263
9.3.3 操作SQLite数据库 263
9.3.4 ContentProvider和ContentResolver 263
9.3.5 Loader和LoaderManager――异步数据库访问 264
9.3.6 定义样式并应用于GUI组件 264
9.3.7 指定TextView背景 265
9.4 构建应用的GUI和资源文件 265
9.4.1 创建工程 265
9.4.2 创建应用的类 265
9.4.3 添加应用图标 266
9.4.4 strings.xml 266
9.4.5 styles.xml 266
9.4.6 textview_border.xml 267
9.4.7 MainActivity的布局 268
9.4.8 ContactsFragment的布局 270
9.4.9 DetailFragment的布局 270
9.4.10 AddEditFragment的布局 271
9.4.11 DetailFragment的菜单 273
9.5 应用中各个类的概述 273
9.6 DatabaseDescription类 274
9.6.1 静态字段 274
9.6.2 嵌套Contact类 275
9.7 AddressBookDatabaseHelper类 275
9.8 AddressBookContentProvider类 277
9.8.1 AddressBookContentProvider字段 277
9.8.2 重写的onCreate和getType方法 278
9.8.3 重写的query方法 279
9.8.4 重写的insert方法 281
9.8.5 重写的update方法 282
9.8.6 重写的delete方法 283
9.9 MainActivity类 284
9.9.1 超类及实现的接口和字段 284
9.9.2 重写的onCreate方法 285
9.9.3 ContactsFragment.ContactsFragmentListener方法 285
9.9.4 displayContact方法 286
9.9.5 displayAddEditFragment方法 287
9.9.6 DetailFragment.DetailFragmentListener方法 288
9.9.7 AddEditFragment.AddEditFragmentListener方法 288
9.10 ContactsFragment类 289
9.10.1 超类及实现的接口 289
9.10.2 ContactsFragmentListener 289
9.10.3 字段 290
9.10.4 重写的Fragment方法onCreateView 290
9.10.5 重写的Fragment方法onAttach和onDetach 291
9.10.6 重写的Fragment方法onActivityCreated 291
9.10.7 updateContactList方法 292
9.10.8 LoaderManager.LoaderCallbacks<Cursor>方法 292
9.11 ContactsAdapter类 293
9.12 AddEditFragment类 296
9.12.1 超类及实现的接口 296
9.12.2 AddEditFragmentListener 297
9.12.3 字段 297
9.12.4 重写的Fragment方法onAttach,onDetach和onCreateView 298
9.12.5 TextWatcher nameChangedListener和updateSaveButtonFAB方法 299
9.12.6 View.OnClickListener saveContactButtonClicked和saveContact方法 300
9.12.7 LoaderManager.LoaderCallbacks<Cursor>方法 301
9.13 DetailFragment类 302
9.13.1 超类及实现的接口 303
9.13.2 DetailFragmentListener 303
9.13.3 字段 303
9.13.4 重写的onAttach,onDetach和onCreateView方法 304
9.13.5 重写的onCreateOptionsMenu和onOptionsItemSelected方法 305
9.13.6 deleteContact方法和DialogFragment confirmDelete 306
9.13.7 LoaderManager.LoaderCallback<Cursor>方法 306
9.14 小结 308
第10章 Google Play及应用的商业问题 309
10.1 简介 309
10.2 为发布应用做准备 310
10.2.1 测试应用 310
10.2.2 最终用户协议 311
10.2.3 图标与卷标 311
10.2.4 为应用定义版本 311
10.2.5 为已付费应用提供访问控制授权 312
10.2.6 弄乱源代码 312
10.2.7 获取密钥,对应用进行数字签名 312
10.2.8 有特色的图像和屏幕截图 312
10.2.9 用于推广应用的视频 313
10.3 为应用定价:免费或收费 314
10.3.1 付费应用 314
10.3.2 免费应用 314
10.4 利用In-App Advertising货币化应用 315
10.5 货币化应用:通过应用内计费功能销售虚拟商品 315
10.6 注册Google Play 316
10.7 设置Google Payments商家账号 317
10.8 将应用上载到Google Play 317
10.9 在应用里启动Play Store 319
10.10 管理Google Play中的应用 319
10.11 其他的Android应用市场 319
10.12 其他移动应用平台及应用移植 320
10.13 应用的市场推广 320
10.14 小结 323
索引 324