内容简介
1入门 投身新领域
欢迎来到Android世界
Android平台剖析
我们要做的工作
你的开发环境
安装Android Studio
构建一个基本应用
如何构建应用
活动和布局概览
如何构建应用(续)
你已经创建了你的第一个Android应用
Android Studio会为你创建一个完整的文件夹结构
工程中的有用文件
用Android Studio编辑器编辑代码
在Android模拟器上运行应用
创建Android虚拟设备
在模拟器中运行应用
可以在控制台上查看进度
发生了什么
改进应用
布局里有什么
activity_main.xml包含两个元素
更新布局中显示的文本
试一试应用
你的Android工具箱
2构建交互式应用 真正有用的应用
构建一个啤酒荐酒师应用
创建工程
我们已经创建了默认活动和布局
详细介绍设计编辑器
使用设计编辑器增加一个按钮
activity_find_beer.xml有一个新按钮
仔细查看布局代码
试一试应用
硬编码文本很难实现本地化
创建字符串资源
在布局中使用字符串资源
activity_find_beer.xml的代码
向spinner增加值
向strings.xml增加string-array
试一试spinner
需要让按钮做些事情
让按钮调用一个方法
活动代码
为活动增加onClickFindBeer()方法
onClickFindBeer()需要做些什么
一旦有了View,就能访问它的方法
更新活动代码
活动的第一个版本
这些代码做什么
构建定制Java类
运行代码时发生了什么
试一试应用
你的Android工具箱
3多个活动和意图 说出你的意图
应用可以包含多个活动
应用结构
开始吧:创建工程
更新布局
创建第二个活动和布局
认识Android清单文件
意图是一个消息类型
运行应用时会发生什么
向第二个活动传递文本
更新文本视图属性
putExtra()在意图中增加额外的信息
更新CreateMessageActivity代码
让ReceiveMessageActivity使用意图中的信息
用户单击Send Message按钮时发生了什么
可以修改应用向其他人发送消息
Android应用如何工作
创建意图指定一个动作
修改意图来使用动作
Android如何使用意图过滤器
如果总是想让用户选择活动该怎么做
调用createChooser()时发生了什么
修改代码创建选择器
你的Android工具箱
4活动生命周期 活动的一生
活动到底如何工作
秒表应用
增加字符串资源
活动代码如何工作
为按钮增加代码
runTimer()方法
完整的runTimer()代码
完整的StopwatchActivity代码
旋转屏幕会改变设备配置
活动的状态
活动生命周期:从创建到撤销
更新的StopwatchActivity代码
运行应用时发生了什么
活动的生命中不只是有创建和撤销
更新的StopwatchActivity代码
运行应用时会发生什么
不过如果应用只是部分可见会怎么样
活动生命周期:前台生命期
如果活动暂停就停止秒表
实现onPause()和onResume()方法
完整的活动代码
运行应用时发生了什么
生命周期方法快速指南
你的Android工具箱
5视图和视图组 享受视图
用户界面由布局和GUI组件组成
LinearLayout将视图显示在一行或一列中
增加尺寸资源文件为不同布局指定一致的内边距
使用外边距增加视图间的距离
调整基本线性布局
增加权重扩展视图
android:gravity属性的可用值
完整的线性布局代码
帧布局叠放视图
为工程增加一个图像
嵌套布局的完整代码
FrameLayout:小结
使用视图
可编辑文本视图
开关按钮
开关
复选框
单选钮
Spinner
图像视图
为按钮增加图像
滚动视图
toast
你的Android工具箱
6约束布局 集中在一起
嵌套布局可能效率很低
引入约束布局
确保你的工程包含约束布局库
向strings.xml增加字符串资源
使用蓝图工具
使用约束指定视图位置
增加一个垂直约束
对蓝图的改变会反映到XML中
如何让视图居中
通过更新偏差调整视图的位置
如何改变视图的大小
如何对齐视图
建立一个真正的布局
首先,增加上面一行视图
推导约束特性会猜测要增加哪些约束
为蓝图增加下一行……
最后,为消息增加一个视图
试一试应用
你的Android工具箱
7列表视图和适配器 合理组织
所有应用都从想法开始
使用ListView导航到数据
饮料详细信息活动
Starbuzz应用结构
Drink类
顶级布局包含一个图像和一个列表
完整的顶级布局代码
利用监听器让列表视图响应单击
为列表视图设置监听器
类别活动显示一个类别的数据
更新activity_drink_category.xml
非静态数据要使用适配器
用数组适配器连接列表视图和数组
为DrinkCategory Activity增加数组适配器
应用回顾:我们做了哪些工作
如何在TopLevelActivity中处理单击
完整的DrinkCategory Activity代码
用数据更新视图
DrinkActivity代码
运行应用时发生了什么
你的Android工具箱
8支持库和应用条 走捷径
好应用都有清晰的结构
不同类型的导航
应用主题来增加应用条
创建披萨应用
增加v7 AppCompat支持库
AndroidManifest.xml可以改变应用条的外观
如何应用主题
在样式资源文件中定义样式
定制应用的外观
在颜色资源文件中定义颜色
activity_main.xml的代码
ActionBar与Toolbar比较
在活动布局中包含工具条
为应用条增加动作
增加标签来改变应用条文本
AndroidManifest.xml的代码
控制动作的外观
完整的MainActivity.java代码
启用向上导航
在应用条上共享内容
为menu_ main.xml增加一个共享动作提供者
用意图指定内容
完整的MainActivity.java代码
你的Android工具箱
9片段 模块化
你的应用在所有设备上都要表现良好
应用可能还要有不同的行为
片段支持重用代码
应用的手机版本
创建工程和活动
为MainActivity的布局增加一个按钮
如何向工程增加片段
片段的onCreateView()方法
向活动布局增加片段
让片段与活动交互
Workout类
向片段传递训练项目ID
让活动设置训练项目ID
片段生命周期
在片段的onStart()方法中设置视图的值
如何创建列表片段
更新的WorkoutListFragment代码
activity_main.xml的代码
连接列表和详细信息
WorkoutListFragment.java的代码
MainActivity需要实现接口
DetailActivity需要向WorkoutDetailFragment传递ID
你的Android工具箱
10面向更大界面的片段 不同大小,不同界面
Workout用在手机和平板电脑上看上去是一样的
面向更大界面的设计
应用的手机版本
应用的平板电脑版本
创建一个平板电脑AVD
将屏幕特定资源放在屏幕特定文件夹中
不同的文件夹选项
平板电脑使用layout-large文件夹中的布局
更新后的代码会做什么
我们要修改itemClicked()代码
希望片段处理后退按钮
认识后退堆栈
后退堆栈事务并不只是活动
通过编程使用帧布局替换片段
利用布局差别区分设备使用的布局
修改后的MainActivity代码
使用片段事务
更新的MainActivity代码
旋转平板电脑时应用会出问题
(再谈)保存活动的状态
更新的WorkoutDetailFragment.java代码
你的Android工具箱
11动态片段 嵌套片段
增加动态片段
应用的新版本
创建TempActivity
TempActivity需要扩AppCompatActivity
StopwatchFragment.java的代码
StopwatchFragment布局
将StopwatchFragment增加到TempActivity的布局
onClick属性调用活动中的方法,而不是片段的方法
将OnClickListener关联到按钮
StopwatchFragment代码
旋转设备会重置秒表
对静态片段使用〈fragment〉……
修改activity_temp.xml来使用FrameLayout
TempActivity.java的完整代码
为WorkoutDetailFragment增加秒表
完整的WorkoutDetailFragment.java代码
你的Android工具箱
12设计支持库 向右滑动
再来看披萨应用
应用结构
使用视图分页控件在片段间滑动
为MainActivity的布局增加一个视图分页控件
使用片段分页控件适配器让视图分页控件了解页面
片段分页控件适配器的代码
完整的MainActivity java代码
为MainActivity增加标签页导航
如何向布局增加标签页
将标签页布局关联到视图分页控件
完整的MainActivity.java代码
设计支持库帮助你实现材料设计
让工具条响应滚动
向MainActivity的布局增加一个协调器布局
如何协调滚动行为
为TopFragment增加可滚动的内容
完整的fragment_top.xml代码
向OrderActivity增加折叠工具条
如何创建一个普通的折叠工具条
如何为折叠工具条增加图像
更新后的activity_order.xml代码
FAB和snackbar
更新后的activity_order.xml代码
完整的OrderActivity.java代码
你的Android工具箱
13回收视图和卡片视图 回收
披萨应用还有工作要做
回收视图概览
增加披萨数据
在卡片中显示披萨数据
如何创建卡片视图
完整的card captioned_image.xml代码
增加回收视图适配器
定义适配器的视图持有者
覆盖onCreateViewHolder()方法
为卡片视图增加数据
完整的CaptionedImagesAdapterjava代码
创建回收视图
为PizzaFragment的布局增加RecyclerView
完整的PizzaFragment.java代码
回收视图使用一个布局管理器排列视图
指定布局管理器
完整的PizzaFragment.java代码
让回收视图响应单击
创建PizzaDetailActivity
PizzaDetailActivity.java的代码
让回收视图响应单击
可以从适配器监听视图事件
使你的适配器可重用
为适配器增加接口
PizzaFragment.java中实现监听器
你的Android工具箱
14导航抽屉 周游世界
标签页布局允许用户轻松导航……
我们要为一个新email应用创建一个导航抽屉
导航抽屉解析
创建CatChat工程
创建InboxFragment
创建DraftsFragment
创建SentItemsFragment
创建TrashFragment
创建一个工具条布局
更新应用的主题
创建HelpActivity
创建FeedbackActivity
创建导航抽屉头部
完整的nav header.xml代码
如何分组
把支持区段增加为一个子菜单
完整的menu nav.xml代码
如何创建导航抽屉
完整的activity_main.xml代码
为MainActivity的帧布局增加InboxFragment
增加抽屉开关
用户点击抽屉中的菜单项时做出响应
实现onNavigationItemSelected()方法
用户按后退按钮时关闭抽屉
完整的MainActivity.java代码
你的Android工具箱
15SQLite数据库 启动数据库
再来看Starbuzz
Android使用SQLite数据库持久存储数据
Android提供了一些SQLite类
当前的Starbuzz应用结构
修改应用来使用数据库
SQLite帮助器管理数据库
创建SQLite帮助器
SQLite数据库内部
使用结构化查询语言(SQL)创建表
使用insert()方法插入数据
插入多个记录
StarbuzzDatabaseHelper代码
SQLite帮助器代码会做什么
如果想要修改数据库呢?
SQLite数据库有一个版本号
改变版本号时会发生什么
用onUpgrade()升级数据库
用onDowngrade()降级数据库
下面来升级数据库
升级现有的数据库
用update()方法更新记录
对多个列应用条件
修改数据库结构
删除表
完整的SQLite帮助器代码
你的Android工具箱
16基本游标 取出数据
目前为止完成的工作……
Starbuzz应用的新结构
如何修改DrinkActivi来使用Starbuzz数据库
目前的DrinkActivity代码
得到数据库引用
用游标从数据库获取数据
从一个表返回所有记录
以特定顺序返回记录
返回选择的记录
到目前为止的DrinkActivity代码
要从游标读取记录,首先需要导航到这个记录
导航游标
获取游标值
DrinkActivity代码
目前为止完成的工作
目前的DrinkCategoryActivity代码
得到Starbuzz数据库的一个引用……
如何替换列表视图中的数组数据?
简单游标适配器将游标数据映射到视图
如何使用简单游标适配器
关闭游标和数据库
未完,继续
修改后的DrinkCategory Activity代码
DrinkCategory Activity代码(续)
你的Android工具箱
17游标与asynctasks 保持在后台
我们希望Starbuzz应用更新数据库数据
向DrinkActivity的布局增加一个复选框
显示FAVORITE列的值
响应单击事件来更新数据库
完整的DrinkActivity.java代码
在TopLevelActivity中显示用户的最爱
重构TopLevelActivity.java
新的TopLevelActivity.java代码
用changeCursor()改变游标
哪些代码在哪个线程中运行?
AsyncTask完成异步任务
onPreExecute()方法
doInBackground()方法
onProgressUpdate()方法
onPostExecute()方法
AsyncTask类
完整的UpdateDrinkTask类
完整的DrinkActivity java代码
你的Android工具箱
AsyncTask步骤小结
18启动式服务 愿意为您效劳
服务在后台工作
创建一个启动式服务
使用IntentService类创建一个基本启动式服务
如何记录消息日志
完整的DelayedMessageService代码
在AndroidManifest.xml中声明服务
为activity_main.xml增加一个按钮
使用startService()启动服务
启动式服务的状态
启动式服务生命周期:从创建到撤销
服务继承了生命周期方法
Android有一个内置的通知服务
我们将使用AppCompat支持库的通知
创建一个通知生成器
使用内置通知服务发出通知
完整的DelayedMessageService.java代码
你的Android工具箱
19绑定式服务和权限 绑定在一起
绑定式服务绑定到其他组件
创建一个新服务
实现一个绑定器
为服务增加一个getDistance()方法
更新MainActivity的布局
创建一个ServiceConnection
使用bindService()绑定服务
使用unbindService()与服务解除绑定
调用OdometerService的getDistance()方法
完整的MainActivity java代码
绑定式服务的状态
增加AppCompat支持库
为OdometerService增加位置监听器
更新的OdometerService代码
计算走过的距离
完整的OdometerService.java代码
让应用请求权限
检查用户对权限请求的响应
将通知代码增加到onRequestPermissionsResults()
完整的MainActivity.java代码
你的Android工具箱
很高兴你能来到Android世界
1.发布你的应用
2.内容提供者
3.加载器
4.同步适配器
5.广播
6.WebView类
7.设置
8.动画
9.APP部件
10.自动测试