内容简介:
权威、全面、实用、易懂,是本书最大的特色。本书根据美国大名鼎鼎的Big Nerd Ranch训练营的Android培训讲义编写而成,已经为微软、谷歌、Facebook等行业巨头培养了众多专业人才。作者巧妙地把Android开发所需的庞杂知识、行业实践、编程规范等融入一本书中,通过精心编排的应用示例、循序渐进的内容组织,以及循循善诱的语言,深入地讲解了Android开发的方方面面。如果学完一章之后仍然意犹未尽,那“挑战练习”一定会让你大呼过瘾。本书之所以能在移动应用开发类图书中脱颖而出,还在于它真的是在与读者“对话”。阅读本书就好像有一位私人导师在你身边随时为你答疑解惑。
本书适合所有对Android及移动开发感兴趣的读者,需要一定的Java编程基础。
作者简介:
作者简介:
Bill Phillips
Big Nerd Ranch资深Android讲师、高级软件工程师。他与Brian Hardy合作,为Big Nerd Ranch开发了广受好评的5天Android训练营培训课程。Bill擅长透彻地理解事物的本质,并帮助其他人做到这一点。闲暇时间,Bill喜欢阅读和弹钢琴。
Brian Hardy
Big Nerd Ranch首席软件工程师、资深讲师。Big Nerd Ranch的Android、iOS和Ruby培训课程均由Brian设计开发。闲暇时间,Brian喜欢骑自行车和听音乐。
目录:
第1章 Android应用初体验1
1.1 应用基础2
1.2 创建Android项目2
1.3 Eclipse工作区导航5
1.4 用户界面设计6
1.4.1 视图层级结构9
1.4.2 组件属性10
1.4.3 创建字符串资源11
1.4.4 预览界面布局12
1.5 从布局XML到视图对象13
1.6 组件的实际应用15
1.6.1 类包组织导入16
1.6.2 引用组件16
1.6.3 设置监听器17
1.7 使用模拟器运行应用21
1.8 Android编译过程22
第2章 Android与MVC设计模式26
2.1 创建新类26
2.2 Android与MVC设计模式30
2.3 更新视图层31
2.4 更新控制层33
2.5 在设备上运行应用37
2.5.1 连接设备37
2.5.2 配置设备用于应用开发38
2.6 添加图标资源38
2.6.1 向项目中添加资源39
2.6.2 在XML文件中引用资源40
2.7 关于挑战练习41
2.8 挑战练习一:为TextView添加监听器41
2.9 挑战练习二:添加后退按钮42
2.10 挑战练习三:从按钮到图标按钮42
第3章 Activity的生命周期45
3.1 日志跟踪理解Activity生命周期46
3.1.1 输出日志信息46
3.1.2 使用 LogCat48
3.2 设备旋转与Activity生命周期52
3.3 设备旋转前保存数据56
3.4 再探Activity生命周期57
3.5 深入学习:测试onSaveInstanceState-(Bundle)方法59
3.6 深入学习:日志记录的级别与方法60
第4章 Android应用的调试62
4.1 DDMS应用调试透视图63
4.2 异常与栈跟踪64
4.2.1 诊断应用异常65
4.2.2 记录栈跟踪日志66
4.2.3 设置断点68
4.2.4 使用异常断点71
4.3 文件浏览器72
4.4 Android特有的调试工具73
4.4.1 使用Android Lint73
4.4.2 R类的问题74
第5章 第二个activity75
5.1 创建第二个activity76
5.1.1 创建新布局77
5.1.2 创建新的activity子类80
5.1.3 在manifest配置文件中声明activity81
5.1.4 为QuizActivity添加cheat按钮82
5.2 启动activity83
5.3 activity间的数据传递85
5.3.1 使用intent extra86
5.3.2 从子activity获取返回结果88
5.4 activity的使用与管理92
5.5 挑战练习95
第6章 Android SDK版本与兼容96
6.1 Android SDK版本96
6.2 Android编程与兼容性问题97
6.2.1 全新的系统版本——Honeycomb97
6.2.2 SDK最低版本99
6.2.3 SDK目标版本99
6.2.4 SDK编译版本99
6.2.5 安全添加新版本API中的代码100
6.3 使用Android开发者文档103
6.4 挑战练习:报告编译版本105
第7章 UI fragment与fragment 管理器106
7.1 UI设计的灵活性需求107
7.2 fragment的引入107
7.3 着手开发CriminalIntent108
7.3.1 创建新项目110
7.3.2 fragment与支持库112
7.3.3 创建Crime类113
7.4 托管UI fragment115
7.4.1 fragment的生命周期115
7.4.2 托管的两种方式116
7.4.3 定义容器视图116
7.5 创建UI fragment117
7.5.1 定义CrimeFragment的布局118
7.5.2 创建CrimeFragment类119
7.6 添加UI fragment到FragmentManager122
7.6.1 fragment事务123
7.6.2 FragmentManager与fragment生命周期125
7.7 activity使用fragment的理由127
7.8 深入学习:Honeycomb、ICS、Jelly Bean以及更高版本系统上的应用开发127
第8章 使用布局与组件创建用户界面128
8.1 升级Crime类128
8.2 更新布局129
8.3 生成并使用组件131
8.4 深入探讨XML布局属性132
8.4.1 样式、主题及主题属性132
8.4.2 dp、sp以及屏幕像素密度133
8.4.3 Android开发设计原则134
8.4.4 布局参数135
8.4.5 边距与内边距135
8.5 使用图形布局工具136
8.5.1 添加新组件138
8.5.2 属性视图中编辑组件属性138
8.5.3 在框架视图中重新组织组件139
8.5.4 更新子组件的布局参数140
8.5.5android:layout_weight属性的工作原理141
8.5.6 图形布局工具使用总结142
8.5.7 组件ID与多种布局142
8.6 挑战练习:日期格式化143
第9章 使用ListFragment显示列表144
9.1 更新CriminalIntent应用的模型层145
9.2 创建ListFragment147
9.3 使用抽象activity托管fragment149
9.3.1 通用的fragment托管布局149
9.3.2 抽象activity类150
9.4 ListFragment、ListView及ArrayAdapter154
9.4.1 创建ArrayAdapter<T>类实例157
9.4.2 响应列表项的点击事件159
9.5 定制列表项160
9.5.1 创建列表项布局160
9.5.2 创建adapter子类162
第10章 使用fragment argument165
10.1 从fragment中启动activity165
10.1.1 附加extra信息166
10.1.2 获取extra信息167
10.1.3 使用Crime数据更新CrimeFragment视图167
10.1.4 直接获取extra信息方式的缺点169
10.2 fragment argument169
10.2.1 附加argument给fragment169
10.2.2 获取argument170
10.3 重新加载显示列表项171
10.4 通过fragment获取返回结果172
第11章 使用ViewPager174
11.1 创建CrimePagerActivity175
11.1.1 以代码的方式定义并产生布局176
11.1.2 ViewPager与Pager-Adapter177
11.1.3 整合配置并使用CrimePagerActivity178
11.1.4 FragmentStatePager-Adapter与Fragment-PagerAdapter180
11.2 深入学习:ViewPager的工作原理182
第12章 对话框184
12.1 创建DialogFragment186
12.1.1 显示DialogFragment187
12.1.2 设置对话框的显示内容188
12.2 fragment间的数据传递190
12.2.1 传递数据给DatePicker-Fragment191
12.2.2 返回数据给CrimeFragment193
12.3 挑战练习:更多对话框198
第13章 使用MediaPlayer播放音频199
13.1 添加资源200
13.2 定义HelloMoonFragment布局文件202
13.3 创建HelloMoonFragment203
13.4 使用布局fragment204
13.5 音频播放205
13.6 挑战练习:暂停音频播放208
13.7 深入学习:播放视频208
13.8 挑战练习:在HelloMoon应用中播放视频208
第14章 fragment的保留209
14.1 保留fragment实例209
14.2 设备旋转与保留的fragment210
14.3 保留的fragment:一切都完美了吗212
14.4 设备旋转处理与onSaveInstance-State(Bundle)方法212
14.5 深入学习:fragment引入前的设备旋转问题214
第15章 应用本地化215
15.1 本地化资源215
15.2 配置修饰符216
15.2.1 可用资源优先级排定217
15.2.2 多重配置修饰符218
15.2.3 寻找最匹配的资源219
15.3 更多资源使用原则及控制220
15.3.1 资源命名220
15.3.2 资源目录结构220
15.4 测试备选资源221
第16章 操作栏223
16.1 选项菜单223
16.1.1 在XML文件中定义选项菜单225
16.1.2 创建选项菜单227
16.1.3 响应菜单项选择230
16.2 实现层级式导航232
16.2.1 启用应用图标的导航功能232
16.2.2 响应向上按钮233
16.3 可选菜单项236
16.3.1 创建可选菜单XML文件236
16.3.2 切换菜单项标题237
16.3.3 “还有个问题”238
16.4 挑战练习:用于列表的空视图239
第17章 存储与加载本地文件241
17.1 CriminalIntent应用的数据存取241
17.1.1 保存crime数据到JSON文件242
17.1.2 从文件中读取crime数据246
17.2 挑战练习:使用外部存储248
17.3 深入学习:Android文件系统与Java I/O248
第18章 上下文菜单与上下文操作模式250
18.1 定义上下文菜单资源251
18.2 实施浮动上下文菜单251
18.2.1 创建上下文菜单251
18.2.2 为上下文菜单登记视图252
18.2.3 响应菜单项选择253
18.3 实施上下文操作模式254
18.3.1 实现列表视图的多选操作255
18.3.2 列表视图中的操作模式回调方法256
18.3.3 改变已激活视图的显示背景258
18.3.4 实现其他视图的上下文操作模式259
18.4 兼容性问题:回退还是复制260
18.5 挑战练习:在CrimeFragment视图中删除crime记录261
18.6 深入学习:ActionBarSherlock261
18.7 挑战练习:使用ActionBarSherlock263
18.7.1 CriminalIntent应用中ABS的基本整合264
18.7.2 ABS的深度整合264
18.7.3 ABS的完全整合265
第19章 相机I:取景器266
19.1 创建Fragment布局267
19.2 创建CrimeCameraFragment269
19.3 创建CrimeCameraActivity269
19.4 使用相机API271
19.4.1 打开并释放相机271
19.4.2 SurfaceView、Surface-Holder与Surface272
19.4.3 确定预览界面大小276
19.4.4 启动CrimeCamera-Activity277
19.5 深入学习:以命令行的方式运行activity281
第20章 相机 II:拍摄并处理照片283
20.1 拍摄照片283
20.1.1 实现相机回调方法285
20.1.2 设置图片尺寸大小288
20.2 返回数据给CrimeFragment288
20.2.1 以接收返回值的方式启动CrimeCameraActivity289
20.2.2 在CrimeCameraFragment中设置返回值290
20.2.3 在CrimeFragment中获取照片文件名290
20.3 更新模型层291
20.3.1 新增Photo类292
20.3.2 为Crime添加photo属性293
20.3.3 设置photo属性293
20.4 更新CrimeFragment的视图294
20.4.1 添加ImageView组件295
20.4.2 图像处理296
20.5 在DialogFragment中显示大图片300
20.6 挑战练习:Crime照片的显示方向303
20.7 挑战练习:删除照片303
20.8 深入学习:Android代码的废弃处理303
第21章 隐式intent305
21.1 添加按钮组件306
21.2 添加嫌疑人信息至模型层307
21.3 使用格式化字符串308
21.4 使用隐式intent309
21.4.1 典型隐式intent的组成310
21.4.2 发送陋习报告311
21.4.3 获取联系人信息313
21.4.4 检查可以响应的activity316
21.5 挑战练习:又一个隐式intent317
第22章 Master-Detail用户界面318
22.1 增加布局灵活性319
22.1.1 修改SingleFragment-Activity320
22.1.2 创建包含两个fragment容器的布局320
22.1.3 使用别名资源322
22.2 Activity:fragment的托管者323
22.3 深入学习:设备屏幕尺寸的确定331
第23章 深入学习intent和任务333
23.1 创建NerdLauncher项目333
23.2 解析隐式intent334
23.3 在运行时创建显式intent337
23.4 任务与后退栈338
23.5 使用NerdLauncher应用作为设备主屏幕341
23.6 挑战练习:应用图标与任务重排341
23.7 进程与任务341
第24章 样式与include标签的使用343
24.1 创建RemoteControl项目344
24.1.1 编码实现RemoteControl-Activity344
24.1.2 创建RemoteControl-Fragment345
24.2 使用样式消除重复代码348
24.3 完善布局定义350
24.4 深入学习:使用include与merge标签353
24.5 挑战练习:样式的继承354
第25章 XML Drawable与9-Patches355
25.1 XML drawable356
25.2 state list drawable358
25.3 layer list与inset drawable360
25.4 使用9-patch图像362
第26章 HTTP与后台任务368
26.1 创建PhotoGallery应用369
26.2 网络连接基本372
26.3 使用AsyncTask在后台线程上运行代码373
26.4 线程与主线程375
26.5 获取Flickr XML数据377
26.6 从AsyncTask回到主线程382
26.7 深入学习:再探AsyncTask385
26.8 挑战练习:分页386
第27章 Looper、Handler与HandlerThread387
27.1 设置GridView以显示图片387
27.2 批量下载缩略图390
27.3 与主线程通信390
27.4 创建并启动后台线程391
27.5 Message与message Handler393
27.5.1 消息的剖析393
27.5.2 Handler的剖析393
27.5.3 使用handler395
27.5.4 传递handler397
27.6 深入学习:AsyncTask与Thread401
27.7 挑战练习:预加载以及缓存401
第28章 搜索402
28.1 搜索Flickr网站402
28.2 搜索对话框404
28.2.1 创建搜索界面404
28.2.2 可搜索的activity406
28.2.3 物理搜索键408
28.2.4 搜索的工作原理409
28.2.5 启动模式与新的intent410
28.2.6 使用shared preferences实现轻量级数据存储412
28.3 在Android 3.0以后版本的设备上使用SearchView414
28.4 挑战练习416
第29章 后台服务417
29.1 创建IntentService417
29.2 服务的作用419
29.3 查找最新返回结果421
29.4 使用AlarmManager延迟运行服务422
29.4.1 PendingIntent424
29.4.2 使用PendingIntent管理定时器424
29.5 控制定时器425
29.6 通知信息428
29.7 深入学习:服务细节内容429
29.7.1 服务的能与不能430
29.7.2 服务的生命周期430
29.7.3 non-sticky服务430
29.7.4 sticky服务431
29.7.5 绑定服务431
第30章 broadcast Intent433
30.1 随设备重启而重启的定时器433
30.1.1 配置文件中的broadcast receiver434
30.1.2 如何使用receiver435
30.2 过滤前台通知消息436
30.2.1 发送broadcast intent437
30.2.2 动态broadcast receiver437
30.2.3 使用私有权限440
30.2.4 使用ordered broadcast接收结果442
30.3 receiver与长时运行任务446
第31章 网页浏览447
31.1 最后一段Flickr数据447
31.2 简单方式:使用隐式intent448
31.3 较难方式:使用WebView449
31.3.1 使用WebChromeClient优化WebView的显示453
31.3.2 处理WebView的设备旋转问题455
31.4 深入学习:注入JavaScript对象456
第32章 定制视图与触摸事件457
32.1 创建DragAndDraw项目457
32.1.1 创建DragAndDraw-Activity458
32.1.2 创建DragAndDraw-Fragment459
32.2 创建定制视图460
32.3 处理触摸事件462
32.4 onDraw(...)方法内的图形绘制465
32.5 挑战练习:设备旋转问题467
第33章 跟踪设备的地理位置468
33.1 启动RunTracker项目468
33.1.1 创建RunActivity469
33.1.2 创建RunFragment470
33.2 地理位置与LocationManager472
33.3 接收定位数据更新broadcast474
33.4 使用定位数据刷新UI显示475
33.5 快速定位:最近一次地理位置479
33.6 在物理和虚拟设备上测试地理位置定位480
第34章 使用SQLite本地数据库482
34.1 在数据库中存储旅程和地理位置信息482
34.2 查询数据库中的旅程列表488
34.3 使用CursorAdapter显示旅程列表490
34.4 创建新旅程493
34.5 管理现有旅程494
34.6 挑战练习:识别当前跟踪的旅程500
第35章 使用Loader加载异步数据501
35.1 Loader与LoaderManager501
35.2 在RunTracker应用中使用Loader502
35.3 加载旅程列表503
35.4 加载单个旅程506
35.5 加载旅程的最近一次地理位置509
第36章 使用地图511
36.1 添加Maps API给RunTracker应用511
36.1.1 使用物理设备测试地图511
36.1.2 安装使用Google Play services SDK511
36.1.3 获取Google Maps API key512
36.1.4 更新RunTracker应用的manifest配置文件512
36.2 在地图上显示用户的地理位置513
36.3 显示旅程路线516
36.4 为旅程添加开始和结束地图标注520
36.5 挑战练习:实时数据更新521
第37章 编后语522
37.1 终极挑战522
37.2 关于我们523
37.3 致谢523
文章试读:首先我们来创建一个Android项目。Android项目包含组成一个应用的全部文件。启动Eclipse程序,选择File→New→Android Application Project菜单项,打开新建应用窗口来创建一个新的项目。 在应用名称(Application Name)处输入GeoQuiz,如图1-3所示。此时项目名称(Project Name)会自动更新为GeoQuiz。在包名处(Pac...
(查看全部试读)