Android编程权威指南(第2版)

Android编程权威指南(第2版)
分享
扫描下方二维码分享到微信
打开微信,点击右上角”+“,
使用”扫一扫“即可将网页分享到朋友圈。
作者: [美] (Bill Phillips)
出版社: 人民邮电出版社
2016-05
版次: 2
ISBN: 9787115422460
定价: 109.00
装帧: 平装
开本: 16开
纸张: 胶版纸
页数: 551页
字数: 839千字
正文语种: 简体中文
原版书名: Android Programming: The Big Nerd Ranch Guide (2nd Edition)
  • Big Nerd Ranch是美国一家专业的移动开发技术培训机构。本书主要以其Android训练营教学课程为基础,融合了几位作者多年的心得体会,是一本完全面向实战的Android编程指南。全书共34章,详细介绍了8个Android 应用。通过这些精心设计的应用,读者可掌握很多重要的理论知识和开发技巧,获得前沿的开发经验。如果你熟悉Java语言,或者了解面向对象编程,那就立刻开始Android编程之旅吧! Bill PhillipsBig Nerd Ranch骨灰级讲师。他在Big Nerd Ranch与人合作开发了广受好评的Android训练营培训课程,并为之编写教材(包括本书第1版)。此后,Bill一直坚持撰写博客、阅读各类文学作品、作曲奏乐以及著书。Chris StewartBig Nerd Ranch骨灰级Android训练营讲师、Android团队主管。他致力于不断取得进步,精进技能。不坐在电脑前时,Chris喜欢远足和旅行。Brian HardyBig Nerd Ranch的iOS和Cocoa工程主管。他是Android训练营的首批讲师,与许多客户合作开发了众多Android和iOS移动应用。除同开发团队构建更出色的软件和研究自己新的项目之外,Brian喜欢陪伴朋友与家人——通常是在烧烤架旁。Kristin MarsicanoBig Nerd Ranch讲师、Android开发者。她喜欢与他人分享知识,对学习、软件开发以及二者的交集充满热情。在授课和开发应用之余,Kristin会为家人烹调美食、练习瑜伽或学习一些新知识。王明发毕业于华东理工大学。软件开发及项目管理者,拥有近十年的软件开发及项目管理经验;译者,另译有《写给大家看的项目管理书(第3版)》。 第1章 Android开发初体验  11.1 应用开发基础 11.2 创建Android项目 21.3 Android Studio使用导航 61.4 用户界面设计 71.4.1 视图层级结构 101.4.2 组件属性 111.4.3 创建字符串资源 121.4.4 预览界面布局 121.5 从布局XML到视图对象 131.6 组件的实际应用 171.6.1 引用组件 181.6.2 设置监听器 181.7 创建提示消息 201.8 使用模拟器运行应用 231.9 深入学习:Android编译过程 25第2章 Android与MVC设计模式 292.1 创建新类 292.2 Android与MVC设计模式 322.3 更新视图层 342.4 更新控制层 362.5 在设备上运行应用 402.5.1 连接设备 402.5.2 配置设备用于应用开发 412.6 添加图标资源 422.6.1 向项目中添加资源 432.6.2 在XML文件中引用资源 452.7 关于挑战练习 462.8 挑战练习:为TextView添加监听器 462.9 挑战练习:添加后退按钮 462.10 挑战练习:从按钮到图标按钮 47第3章 Activity的生命周期 493.1 日志跟踪理解Activity生命周期 503.1.1 输出日志信息 503.1.2 使用LogCat 523.2 设备旋转与Activity生命周期 553.3 设备旋转前保存数据 593.4 再探Activity生命周期 613.5 深入学习:测试onSaveInstanceState(Bundle)方法 623.6 深入学习:日志记录的级别与方法 64第4章 Android应用的调试 654.1 异常与栈跟踪 664.1.1 诊断应用异常 674.1.2 记录栈跟踪日志 684.1.3 设置断点 694.1.4 使用异常断点 724.2 Android特有的调试工具 734.2.1 使用Android Lint 734.2.2 R 类的问题 75第5章 第二个activity 765.1 创建第二个activity 775.1.1 创建新的activity 785.1.2 创建新的activity 子类 815.1.3 在manifest配置文件中声明activity 815.1.4 为QuizActivity添加Cheat按钮 825.2 启动activity 845.3 activity间的数据传递 865.3.1 使用intent extra 865.3.2 从子activity获取返回结果 895.4 activity的使用与管理 945.5 挑战练习 97第6章 Android SDK版本与兼容 986.1 Android SDK版本 986.2 Android编程与兼容性问题 996.2.1 比较合理的版本 996.2.2 SDK最低版本 1016.2.3 SDK目标版本 1016.2.4 SDK编译版本 1016.2.5 安全添加新版本API中的代码 1016.3 使用Android开发者文档 1046.4 挑战练习:报告编译版本 106第7章 UI fragment与fragment管理器 1077.1 UI 设计的灵活性需求 1087.2 fragment的引入 1087.3 着手开发CriminalIntent 1097.3.1 创建新项目 1127.3.2 fragment与支持库 1137.3.3 在Android Studio中增加依赖关系 1147.3.4 创建Crime类 1177.4 托管UI fragment 1187.4.1 fragment的生命周期 1187.4.2 托管的两种方式 1197.4.3 定义容器视图 1197.5 创建UI fragment 1207.5.1 定义CrimeFragment的布局 1217.5.2 创建CrimeFragment类 1227.6 添加UI fragment到FragmentManager 1257.6.1 fragment事务 1267.6.2 FragmentManager与fragment生命周期 1297.7 采用fragment的应用架构 1307.8 深入学习:为什么应优先使用支持库版fragment 1317.9 深入学习:使用操作系统内置版fragment 131第8章 使用布局与组件创建用户界面 1328.2 更新布局 1338.3 生成并使用组件 1358.4 深入探讨XML布局属性 1368.4.1 样式、主题及主题属性 1368.4.2 dp、sp以及屏幕像素密度 1378.4.3 Android开发设计原则 1388.4.4 布局参数 1398.4.5 边距与内边距 1398.5 使用图形布局工具 1408.5.1 创建水平模式布局 1418.5.2 添加新组件 1428.5.3 在属性视图中编辑组件属性 1438.5.4 在框架视图中重新组织组件 1448.5.5 更新子组件的布局参数 1458.5.6 android:layout_weight属性的工作原理 1468.5.7 图形布局工具使用总结 1478.5.8 组件ID与多种布局 1488.6 挑战练习:日期格式化 148第9章 使用RecyclerView显示列表 1509.2 使用抽象activity托管fragment 1539.2.1 通用的fragment托管布局 1539.2.2 抽象activity类 1549.3 RecyclerView、Adapter和ViewHolder 1589.3.1 ViewHolder和Adapter 1599.3.2 使用RecyclerView 1619.3.3 实现Adapter和ViewHolder 1669.4.1 创建列表项布局 1669.4.2 使用定制列表项视图 1689.5 响应点击 1709.6 深入学习:ListView和GridView 1719.7 深入学习:单例 171第10章 使用fragment argument 17310.1 从fragment中启动activity 17310.1.1 附加extra信息 17410.1.2 获取extra信息 17510.1.3 使用Crime数据更新CrimeFragment视图 17610.1.4 直接获取extra信息的缺点 17710.2 fragment argument 17710.2.1 附加argument给fragment 17810.2.2 获取argument 17910.3 刷新显示列表项 18010.4 通过fragment获取返回结果 18210.5 挑战练习:实现高效的RecyclerView 刷新 18310.6 深入学习:为何要用fragment argument 183第11章 使用ViewPager 18511.1 创建CrimePagerActivity 18611.1.1 ViewPager与PagerAdapter 18711.1.2 整合并配置使用CrimePagerActivity 18811.2 FragmentStatePagerAdapter与FragmentPagerAdapter 19011.3 深入学习:ViewPager的工作原理 19211.4 深入学习:以代码的方式创建布局 193第12章 对话框 19412.1 使用AppCompat兼容库 19512.2 创建DialogFragment 19612.2.1 显示DialogFragment 19812.2.2 设置对话框的显示内容 19912.3 fragment间的数据传递 20212.3.1 传递数据给DatePickerFragment 20312.3.2 返回数据给CrimeFragment 20412.4 挑战练习:更多对话框 21112.5 挑战练习:按设备类型展现DialogFragment 212第13章 工具栏 21313.1 AppCompat 21313.2 工具栏菜单 21613.2.1 在XML文件中定义菜单....... 21713.2.2 创建菜单 22113.2.3 响应菜单项选择 22313.3 实现层级式导航 22513.4 可选菜单项 22613.4.1 切换菜单项标题 22713.4.2 “还有个问题” 22913.5 深入学习:工具栏与操作栏 23113.6 挑战练习:删除crime记录 23113.7 挑战练习:优化字符串资源显示 23113.8 挑战练习:用于RecyclerView的空视图 232第14章 SQLite数据库 23314.1 定义Schema 23314.2 创建初始数据库 23414.3 修改CrimeLab类 23814.4 写入数据库 23914.4.1 使用ContentValues 23914.4.2 插入和更新记录 24014.5 读取数据库 24214.5.1 使用CursorWrapper 24314.5.2 创建模型层对象 24414.6 深入学习:数据库高级主题介绍 24714.7 深入学习:应用上下文 24814.8 挑战练习:删除Crime记录 248第15章 隐式intent 24915.1 添加按钮组件 25015.2 添加嫌疑人信息至模型层 25215.3 使用格式化字符串 25415.4 使用隐式intent 25515.4.1 隐式intent的组成 25515.4.2 发送消息 25615.4.3 获取联系人信息 25915.4.4 检查可响应任务的activity 26315.5 挑战练习:ShareCompat 26515.6 挑战练习:又一个隐式intent 265第16章 使用intent拍照 26616.1 布置照片 26616.2 外部存储 26916.3 使用相机intent 27216.3.1 外部存储使用权限 27216.3.2 触发拍照 27316.4 缩放和显示位图 27416.5 功能声明 27716.6 深入学习:使用include标签 27816.7 挑战练习:优化照片显示 27816.8 挑战练习:优化缩略图加载 279第17章 Master-Detail用户界面 28017.1 增加布局灵活性 28117.1.1 修改SingleFragmentActivity 28217.1.2 创建包含两个fragment容器的布局 28317.1.3 使用别名资源 28417.1.4 创建平板设备专用可选资源 28517.2 Activity:fragment的托管者 28617.3 深入学习:设备屏幕尺寸的确定 295第18章 Assets 29718.1 为何使用assets 29718.2 创建BeatBox 应用 29818.3 导入assets 30118.4 处理assets 30318.5 使用Assets 30518.6 访问Assets 30818.7 深入学习:什么是non-assets 308第19章 使用SoundPool播放音频 30919.1 创建SoundPool 30919.2 加载音频文件 31019.3 播放音频 31119.4 释放音频 31319.5 设备旋转和对象保存 31419.5.1 保留fragment 31519.5.2 旋转和已保留fragment 31619.6 深入学习:是否要保留 31819.7 深入学习:设备旋转处理再探 318第20章 样式与主题 32120.1 颜色资源 32120.2 样式 32220.3 主题 32420.4 添加主题颜色 32720.5 覆盖主题属性 32820.6 修改按钮属性 33220.7 深入学习:样式继承拾遗 33420.8 深入学习:引用主题属性 33520.9 挑战练习:创建多版本主题 335第21章 XML drawable 33621.1 统一按钮样式 33721.2 shape drawable 33821.3 state list drawable 34021.4 layer list drawable 34121.5 深入学习:为什么要用XML drawable 34221.6 深入学习:使用9-patch图像 34321.7 深入学习:使用Mipmap图像 347第22章 深入学习intent和任务 34822.1 创建NerdLauncher项目 34822.2 解析隐式intent 35122.3 在运行时创建显式intent 35522.4 任务与后退栈 35722.4.1 在任务间切换 35722.4.2 启动新任务 35822.5 使用NerdLauncher应用作为设备主屏幕 36122.6 挑战练习:应用图标 36222.7 深入学习:进程与任务 36222.8 深入学习:并发文档 364第23章 HTTP与后台任务 36723.1 创建PhotoGallery应用 36823.2 网络连接基本 37123.3 使用AsyncTask在后台线程上运行代码 37323.4 线程与主线程 37423.5 从Flickr获取JSON数据 37623.6 从AsyncTask回到主线程 38323.7 清理AsyncTask 38623.8 深入学习:AsyncTask再探 38723.9 深入学习:AsyncTask的替代方案 38823.10 挑战练习:Gson 38823.11 挑战练习:分页 38823.12 挑战练习:动态调整网格列 389第24章 Looper、Handler和HandlerThread 39024.1 配置RecyclerView以显示图片 39024.2 批量下载缩略图 39324.3 与主线程通信 39324.4 创建并启动后台线程 39424.5 Message与message handler 39624.5.1 消息的剖析 39724.5.2 Handler的剖析 39724.5.3 使用handler 39824.5.4 传递handler 40224.6 深入学习:AsyncTask与线程 40724.7 挑战练习:预加载以及缓存 40724.8 深入学习:解决图片下载问题 408第25章 搜索 40925.1 搜索Flickr 网站 41025.2 使用SearchView 41425.3 使用shared preferences实现轻量级数据存储 41925.4 优化应用 42225.5 挑战练习:深度优化PhotoGallery应用 423第26章 后台服务 42426.1 创建IntentService 42426.2 服务的作用 42726.3 查找最新返回结果 42826.4 使用AlarmManager延迟运行服务 43026.4.1 合理控制服务启动的频度 43226.4.2 PendingIntent 43326.4.3 使用PendingIntent管理定时器 43426.5 控制定时器 43426.6 通知信息 43726.7 挑战练习:可穿戴设备上的通知 43926.8 深入学习:服务细节内容 44026.8.1 服务的能与不能 44026.8.2 服务的生命周期 44026.8.3 non-sticky服务 44026.8.4 sticky 服务 44126.8.5 绑定服务 44126.9 深入学习:JobScheduler和JobService 44226.10 深入学习:Sync Adapter 44526.11 挑战练习:在Lollipop设备上使用JobService 446第27 章 broadcast intent 44727.1 一般intent 和broadcast intent 44727.2 接收系统broadcast:重启后唤醒 44827.2.1 standalone receiver 44827.2.2 使用receiver 45027.3 过滤前台通知消息 45227.3.1 发送broadcast intent 45227.3.2 动态broadcast receiver 45327.3.3 使用私有权限 45527.3.4 使用有序broadcast 45827.4 receiver与长时运行任务 46227.5 深入学习:本地事件 46227.5.1 使用EventBus 46327.5.2 使用Rxjava 46327.6 深入学习:检测fragment的状态 464第28章 网页浏览 46628.1 最后一段Flickr数据 46628.2 简单方式:隐式intent 46928.3 较难方式:使用WebView 47028.4 处理WebView的设备旋转问题 47628.5 深入学习:注入JavaScript对象 47728.6 深入学习:KitKat的WebView 47828.7 挑战练习:使用后退键浏览历史网页 47828.8 挑战练习:非HTTP链接支持 479第29章 定制视图与触摸事件 48029.1 创建DragAndDraw项目 48029.1.1 创建DragAndDrawActivity 48129.1.2 创建DragAndDrawFragment 48129.2 创建定制视图 48229.3 处理触摸事件 48429.4 onDraw(...)方法内的图形绘制 48829.5 挑战练习:设备旋转问题 49029.6 挑战练习:旋转矩形框 490第30章 属性动画 49230.1 建立场景 49230.2 简单属性动画 49530.2.1 视图属性转换 49830.2.2 使用不同的interpolator 50030.2.3 色彩渐变 50030.3 播放多个动画 50230.4 深入学习:其他动画API 50430.4.1 传统动画工具 50430.4.2 转场 50430.5 挑战练习 504第31章 地理位置和Play服务 50531.1 地理位置和定位类库 50531.2 创建Locatr项目 50631.3 Play 服务和模拟器 50731.4 创建Locatr应用 51031.5 配置Google Play服务 51231.6 使用Google Play服务 51431.7 基于地理位置的Flickr搜索 51631.8 获取定位数据 51731.9 寻找并显示图片 51931.10 挑战练习:进度指示器 521第32章 使用地图 52232.1 导入Play地图服务库 52232.2 Android上的地图服务 52232.3 地图API设置 52332.4 创建地图 52532.5 获取更多地理位置数据 52632.6 使用地图 52932.7 深入学习:团队开发和API key 534第33章 material design 53633.1 material surface 53633.1.1 elevation和Z值 53833.1.2 state list animator 53933.2 动画工具 54033.2.1 circular reveal 54133.2.2 shared element transition 54233.3 新的视图组件 54533.3.1 card 54533.3.2 floating action button 54733.3.3 snackbar 54833.4 深入学习material design 549第34 章 编后语 55034.1 终极挑战 55034.2 关于我们 55134.3 致谢 551
  • 内容简介:
    Big Nerd Ranch是美国一家专业的移动开发技术培训机构。本书主要以其Android训练营教学课程为基础,融合了几位作者多年的心得体会,是一本完全面向实战的Android编程指南。全书共34章,详细介绍了8个Android 应用。通过这些精心设计的应用,读者可掌握很多重要的理论知识和开发技巧,获得前沿的开发经验。如果你熟悉Java语言,或者了解面向对象编程,那就立刻开始Android编程之旅吧!
  • 作者简介:
    Bill PhillipsBig Nerd Ranch骨灰级讲师。他在Big Nerd Ranch与人合作开发了广受好评的Android训练营培训课程,并为之编写教材(包括本书第1版)。此后,Bill一直坚持撰写博客、阅读各类文学作品、作曲奏乐以及著书。Chris StewartBig Nerd Ranch骨灰级Android训练营讲师、Android团队主管。他致力于不断取得进步,精进技能。不坐在电脑前时,Chris喜欢远足和旅行。Brian HardyBig Nerd Ranch的iOS和Cocoa工程主管。他是Android训练营的首批讲师,与许多客户合作开发了众多Android和iOS移动应用。除同开发团队构建更出色的软件和研究自己新的项目之外,Brian喜欢陪伴朋友与家人——通常是在烧烤架旁。Kristin MarsicanoBig Nerd Ranch讲师、Android开发者。她喜欢与他人分享知识,对学习、软件开发以及二者的交集充满热情。在授课和开发应用之余,Kristin会为家人烹调美食、练习瑜伽或学习一些新知识。王明发毕业于华东理工大学。软件开发及项目管理者,拥有近十年的软件开发及项目管理经验;译者,另译有《写给大家看的项目管理书(第3版)》。
  • 目录:
    第1章 Android开发初体验  11.1 应用开发基础 11.2 创建Android项目 21.3 Android Studio使用导航 61.4 用户界面设计 71.4.1 视图层级结构 101.4.2 组件属性 111.4.3 创建字符串资源 121.4.4 预览界面布局 121.5 从布局XML到视图对象 131.6 组件的实际应用 171.6.1 引用组件 181.6.2 设置监听器 181.7 创建提示消息 201.8 使用模拟器运行应用 231.9 深入学习:Android编译过程 25第2章 Android与MVC设计模式 292.1 创建新类 292.2 Android与MVC设计模式 322.3 更新视图层 342.4 更新控制层 362.5 在设备上运行应用 402.5.1 连接设备 402.5.2 配置设备用于应用开发 412.6 添加图标资源 422.6.1 向项目中添加资源 432.6.2 在XML文件中引用资源 452.7 关于挑战练习 462.8 挑战练习:为TextView添加监听器 462.9 挑战练习:添加后退按钮 462.10 挑战练习:从按钮到图标按钮 47第3章 Activity的生命周期 493.1 日志跟踪理解Activity生命周期 503.1.1 输出日志信息 503.1.2 使用LogCat 523.2 设备旋转与Activity生命周期 553.3 设备旋转前保存数据 593.4 再探Activity生命周期 613.5 深入学习:测试onSaveInstanceState(Bundle)方法 623.6 深入学习:日志记录的级别与方法 64第4章 Android应用的调试 654.1 异常与栈跟踪 664.1.1 诊断应用异常 674.1.2 记录栈跟踪日志 684.1.3 设置断点 694.1.4 使用异常断点 724.2 Android特有的调试工具 734.2.1 使用Android Lint 734.2.2 R 类的问题 75第5章 第二个activity 765.1 创建第二个activity 775.1.1 创建新的activity 785.1.2 创建新的activity 子类 815.1.3 在manifest配置文件中声明activity 815.1.4 为QuizActivity添加Cheat按钮 825.2 启动activity 845.3 activity间的数据传递 865.3.1 使用intent extra 865.3.2 从子activity获取返回结果 895.4 activity的使用与管理 945.5 挑战练习 97第6章 Android SDK版本与兼容 986.1 Android SDK版本 986.2 Android编程与兼容性问题 996.2.1 比较合理的版本 996.2.2 SDK最低版本 1016.2.3 SDK目标版本 1016.2.4 SDK编译版本 1016.2.5 安全添加新版本API中的代码 1016.3 使用Android开发者文档 1046.4 挑战练习:报告编译版本 106第7章 UI fragment与fragment管理器 1077.1 UI 设计的灵活性需求 1087.2 fragment的引入 1087.3 着手开发CriminalIntent 1097.3.1 创建新项目 1127.3.2 fragment与支持库 1137.3.3 在Android Studio中增加依赖关系 1147.3.4 创建Crime类 1177.4 托管UI fragment 1187.4.1 fragment的生命周期 1187.4.2 托管的两种方式 1197.4.3 定义容器视图 1197.5 创建UI fragment 1207.5.1 定义CrimeFragment的布局 1217.5.2 创建CrimeFragment类 1227.6 添加UI fragment到FragmentManager 1257.6.1 fragment事务 1267.6.2 FragmentManager与fragment生命周期 1297.7 采用fragment的应用架构 1307.8 深入学习:为什么应优先使用支持库版fragment 1317.9 深入学习:使用操作系统内置版fragment 131第8章 使用布局与组件创建用户界面 1328.2 更新布局 1338.3 生成并使用组件 1358.4 深入探讨XML布局属性 1368.4.1 样式、主题及主题属性 1368.4.2 dp、sp以及屏幕像素密度 1378.4.3 Android开发设计原则 1388.4.4 布局参数 1398.4.5 边距与内边距 1398.5 使用图形布局工具 1408.5.1 创建水平模式布局 1418.5.2 添加新组件 1428.5.3 在属性视图中编辑组件属性 1438.5.4 在框架视图中重新组织组件 1448.5.5 更新子组件的布局参数 1458.5.6 android:layout_weight属性的工作原理 1468.5.7 图形布局工具使用总结 1478.5.8 组件ID与多种布局 1488.6 挑战练习:日期格式化 148第9章 使用RecyclerView显示列表 1509.2 使用抽象activity托管fragment 1539.2.1 通用的fragment托管布局 1539.2.2 抽象activity类 1549.3 RecyclerView、Adapter和ViewHolder 1589.3.1 ViewHolder和Adapter 1599.3.2 使用RecyclerView 1619.3.3 实现Adapter和ViewHolder 1669.4.1 创建列表项布局 1669.4.2 使用定制列表项视图 1689.5 响应点击 1709.6 深入学习:ListView和GridView 1719.7 深入学习:单例 171第10章 使用fragment argument 17310.1 从fragment中启动activity 17310.1.1 附加extra信息 17410.1.2 获取extra信息 17510.1.3 使用Crime数据更新CrimeFragment视图 17610.1.4 直接获取extra信息的缺点 17710.2 fragment argument 17710.2.1 附加argument给fragment 17810.2.2 获取argument 17910.3 刷新显示列表项 18010.4 通过fragment获取返回结果 18210.5 挑战练习:实现高效的RecyclerView 刷新 18310.6 深入学习:为何要用fragment argument 183第11章 使用ViewPager 18511.1 创建CrimePagerActivity 18611.1.1 ViewPager与PagerAdapter 18711.1.2 整合并配置使用CrimePagerActivity 18811.2 FragmentStatePagerAdapter与FragmentPagerAdapter 19011.3 深入学习:ViewPager的工作原理 19211.4 深入学习:以代码的方式创建布局 193第12章 对话框 19412.1 使用AppCompat兼容库 19512.2 创建DialogFragment 19612.2.1 显示DialogFragment 19812.2.2 设置对话框的显示内容 19912.3 fragment间的数据传递 20212.3.1 传递数据给DatePickerFragment 20312.3.2 返回数据给CrimeFragment 20412.4 挑战练习:更多对话框 21112.5 挑战练习:按设备类型展现DialogFragment 212第13章 工具栏 21313.1 AppCompat 21313.2 工具栏菜单 21613.2.1 在XML文件中定义菜单....... 21713.2.2 创建菜单 22113.2.3 响应菜单项选择 22313.3 实现层级式导航 22513.4 可选菜单项 22613.4.1 切换菜单项标题 22713.4.2 “还有个问题” 22913.5 深入学习:工具栏与操作栏 23113.6 挑战练习:删除crime记录 23113.7 挑战练习:优化字符串资源显示 23113.8 挑战练习:用于RecyclerView的空视图 232第14章 SQLite数据库 23314.1 定义Schema 23314.2 创建初始数据库 23414.3 修改CrimeLab类 23814.4 写入数据库 23914.4.1 使用ContentValues 23914.4.2 插入和更新记录 24014.5 读取数据库 24214.5.1 使用CursorWrapper 24314.5.2 创建模型层对象 24414.6 深入学习:数据库高级主题介绍 24714.7 深入学习:应用上下文 24814.8 挑战练习:删除Crime记录 248第15章 隐式intent 24915.1 添加按钮组件 25015.2 添加嫌疑人信息至模型层 25215.3 使用格式化字符串 25415.4 使用隐式intent 25515.4.1 隐式intent的组成 25515.4.2 发送消息 25615.4.3 获取联系人信息 25915.4.4 检查可响应任务的activity 26315.5 挑战练习:ShareCompat 26515.6 挑战练习:又一个隐式intent 265第16章 使用intent拍照 26616.1 布置照片 26616.2 外部存储 26916.3 使用相机intent 27216.3.1 外部存储使用权限 27216.3.2 触发拍照 27316.4 缩放和显示位图 27416.5 功能声明 27716.6 深入学习:使用include标签 27816.7 挑战练习:优化照片显示 27816.8 挑战练习:优化缩略图加载 279第17章 Master-Detail用户界面 28017.1 增加布局灵活性 28117.1.1 修改SingleFragmentActivity 28217.1.2 创建包含两个fragment容器的布局 28317.1.3 使用别名资源 28417.1.4 创建平板设备专用可选资源 28517.2 Activity:fragment的托管者 28617.3 深入学习:设备屏幕尺寸的确定 295第18章 Assets 29718.1 为何使用assets 29718.2 创建BeatBox 应用 29818.3 导入assets 30118.4 处理assets 30318.5 使用Assets 30518.6 访问Assets 30818.7 深入学习:什么是non-assets 308第19章 使用SoundPool播放音频 30919.1 创建SoundPool 30919.2 加载音频文件 31019.3 播放音频 31119.4 释放音频 31319.5 设备旋转和对象保存 31419.5.1 保留fragment 31519.5.2 旋转和已保留fragment 31619.6 深入学习:是否要保留 31819.7 深入学习:设备旋转处理再探 318第20章 样式与主题 32120.1 颜色资源 32120.2 样式 32220.3 主题 32420.4 添加主题颜色 32720.5 覆盖主题属性 32820.6 修改按钮属性 33220.7 深入学习:样式继承拾遗 33420.8 深入学习:引用主题属性 33520.9 挑战练习:创建多版本主题 335第21章 XML drawable 33621.1 统一按钮样式 33721.2 shape drawable 33821.3 state list drawable 34021.4 layer list drawable 34121.5 深入学习:为什么要用XML drawable 34221.6 深入学习:使用9-patch图像 34321.7 深入学习:使用Mipmap图像 347第22章 深入学习intent和任务 34822.1 创建NerdLauncher项目 34822.2 解析隐式intent 35122.3 在运行时创建显式intent 35522.4 任务与后退栈 35722.4.1 在任务间切换 35722.4.2 启动新任务 35822.5 使用NerdLauncher应用作为设备主屏幕 36122.6 挑战练习:应用图标 36222.7 深入学习:进程与任务 36222.8 深入学习:并发文档 364第23章 HTTP与后台任务 36723.1 创建PhotoGallery应用 36823.2 网络连接基本 37123.3 使用AsyncTask在后台线程上运行代码 37323.4 线程与主线程 37423.5 从Flickr获取JSON数据 37623.6 从AsyncTask回到主线程 38323.7 清理AsyncTask 38623.8 深入学习:AsyncTask再探 38723.9 深入学习:AsyncTask的替代方案 38823.10 挑战练习:Gson 38823.11 挑战练习:分页 38823.12 挑战练习:动态调整网格列 389第24章 Looper、Handler和HandlerThread 39024.1 配置RecyclerView以显示图片 39024.2 批量下载缩略图 39324.3 与主线程通信 39324.4 创建并启动后台线程 39424.5 Message与message handler 39624.5.1 消息的剖析 39724.5.2 Handler的剖析 39724.5.3 使用handler 39824.5.4 传递handler 40224.6 深入学习:AsyncTask与线程 40724.7 挑战练习:预加载以及缓存 40724.8 深入学习:解决图片下载问题 408第25章 搜索 40925.1 搜索Flickr 网站 41025.2 使用SearchView 41425.3 使用shared preferences实现轻量级数据存储 41925.4 优化应用 42225.5 挑战练习:深度优化PhotoGallery应用 423第26章 后台服务 42426.1 创建IntentService 42426.2 服务的作用 42726.3 查找最新返回结果 42826.4 使用AlarmManager延迟运行服务 43026.4.1 合理控制服务启动的频度 43226.4.2 PendingIntent 43326.4.3 使用PendingIntent管理定时器 43426.5 控制定时器 43426.6 通知信息 43726.7 挑战练习:可穿戴设备上的通知 43926.8 深入学习:服务细节内容 44026.8.1 服务的能与不能 44026.8.2 服务的生命周期 44026.8.3 non-sticky服务 44026.8.4 sticky 服务 44126.8.5 绑定服务 44126.9 深入学习:JobScheduler和JobService 44226.10 深入学习:Sync Adapter 44526.11 挑战练习:在Lollipop设备上使用JobService 446第27 章 broadcast intent 44727.1 一般intent 和broadcast intent 44727.2 接收系统broadcast:重启后唤醒 44827.2.1 standalone receiver 44827.2.2 使用receiver 45027.3 过滤前台通知消息 45227.3.1 发送broadcast intent 45227.3.2 动态broadcast receiver 45327.3.3 使用私有权限 45527.3.4 使用有序broadcast 45827.4 receiver与长时运行任务 46227.5 深入学习:本地事件 46227.5.1 使用EventBus 46327.5.2 使用Rxjava 46327.6 深入学习:检测fragment的状态 464第28章 网页浏览 46628.1 最后一段Flickr数据 46628.2 简单方式:隐式intent 46928.3 较难方式:使用WebView 47028.4 处理WebView的设备旋转问题 47628.5 深入学习:注入JavaScript对象 47728.6 深入学习:KitKat的WebView 47828.7 挑战练习:使用后退键浏览历史网页 47828.8 挑战练习:非HTTP链接支持 479第29章 定制视图与触摸事件 48029.1 创建DragAndDraw项目 48029.1.1 创建DragAndDrawActivity 48129.1.2 创建DragAndDrawFragment 48129.2 创建定制视图 48229.3 处理触摸事件 48429.4 onDraw(...)方法内的图形绘制 48829.5 挑战练习:设备旋转问题 49029.6 挑战练习:旋转矩形框 490第30章 属性动画 49230.1 建立场景 49230.2 简单属性动画 49530.2.1 视图属性转换 49830.2.2 使用不同的interpolator 50030.2.3 色彩渐变 50030.3 播放多个动画 50230.4 深入学习:其他动画API 50430.4.1 传统动画工具 50430.4.2 转场 50430.5 挑战练习 504第31章 地理位置和Play服务 50531.1 地理位置和定位类库 50531.2 创建Locatr项目 50631.3 Play 服务和模拟器 50731.4 创建Locatr应用 51031.5 配置Google Play服务 51231.6 使用Google Play服务 51431.7 基于地理位置的Flickr搜索 51631.8 获取定位数据 51731.9 寻找并显示图片 51931.10 挑战练习:进度指示器 521第32章 使用地图 52232.1 导入Play地图服务库 52232.2 Android上的地图服务 52232.3 地图API设置 52332.4 创建地图 52532.5 获取更多地理位置数据 52632.6 使用地图 52932.7 深入学习:团队开发和API key 534第33章 material design 53633.1 material surface 53633.1.1 elevation和Z值 53833.1.2 state list animator 53933.2 动画工具 54033.2.1 circular reveal 54133.2.2 shared element transition 54233.3 新的视图组件 54533.3.1 card 54533.3.2 floating action button 54733.3.3 snackbar 54833.4 深入学习material design 549第34 章 编后语 55034.1 终极挑战 55034.2 关于我们 55134.3 致谢 551
查看详情