第一行代码 Android 第2版 pdf

第一行代码 Android 第2版

内容简介

本书被Android开发者誉为Android学习经典。全书系统全面、循序渐进地介绍了Android软件开发的知识、经验和技巧。第2版基于Android 7.0对dy 版进行了全面更新,将所有知识点都在新的Android系统上进行重新适配,使用全新的Android Studio开发工具代替之前的Eclipse,并添加了对Material Design、运行时权限、Gradle、RecyclerView、百分比布局、OkHttp、Lambda表达式等全新知识点的详细讲解。本书内容通俗易懂,由浅入深,既适合Android初学者的入门,也适合Android开发者的进阶。

作者简介

郭霖 Android软件开发工程师。从事Android开发工作6年,有着丰富的项目实战经验,负责及参与开发过多款移动应用与游戏,对Android系统架构及应用层开发有着深入的理解。2013年3月开始,在CSDN上发表Android技术相关博文,很快获得了大量网友的好评。目前博客访问量已超过500万次,评论超过10000条。荣获CSDN认证专家,并被连续评选为CSDN 2013、2014、2015年度博客之星。

目录

第1章开始启程——你的dy行Android代码1

1.1了解全貌——Android王国简介2

1.1.1Android系统架构2

1.1.2Android已发布的版本3

1.1.3Android应用开发特色4

1.2手把手带你搭建开发环境5

1.2.1准备所需要的工具5

1.2.2搭建开发环境5

1.3创建你的dy个Android项目9

1.3.1创建HelloWorld项目9

1.3.2启动模拟器12

1.3.3运行HelloWorld15

1.3.4分析你的dy个Android程序16

1.3.5详解项目中的资源22

1.3.6详解build.gradle文件23

1.4前行 备——掌握日志工具的使用26

1.4.1使用Android的日志工具Log26

1.4.2为什么使用Log而不使用System.out27

1.5小结与点评29

第2章先从看得到的入手——探究活动30

2.1活动是什么30

2.2活动的基本用法30

2.2.1手动创建活动31

2.2.2创建和加载布局32

2.2.3在AndroidManifest文件中注册35

2.2.4在活动中使用Toast37

2.2.5在活动中使用Menu38

2.2.6销毁一个活动40

2.3使用Intent在活动之间穿梭41

2.3.1使用显式Intent41

2.3.2使用隐式Intent44

2.3.3更多隐式Intent的用法46

2.3.4向下一个活动传递数据50

2.3.5返回数据给上一个活动51

2.4活动的生命周期53

2.4.1返回栈53

2.4.2活动状态54

2.4.3活动的生存期55

2.4.4体验活动的生命周期56

2.4.5活动被回收了怎么办62

2.5活动的启动模式63

2.5.1standard64

2.5.2singleTop65

2.5.3singleTask67

2.5.4singleInstance68

2.6活动的 实践71

2.6.1知晓当前是在哪一个活动71

2.6.2随时随地退出程序72

2.6.3启动活动的 写法74

2.7小结与点评75

第3章软件也要拼脸蛋——UI开发的点点滴滴76

3.1如何编写程序界面76

3.2常用控件的使用方法77

3.2.1TextView77

3.2.2Button80

3.2.3EditText82

3.2.4ImageView86

3.2.5ProgressBar88

3.2.6AlertDialog91

3.2.7ProgressDialog93

3.3详解4种基本布局94

3.3.1线性布局94

3.3.2相对布局100

3.3.3帧布局103

3.3.4百分比布局105

3.4系统控件不够用?创建自定义控件108

3.4.1引入布局109

3.4.2创建自定义控件111

3.5 常用和 难用的控件——ListView113

3.5.1ListView的简单用法114

3.5.2定制ListView的界面115

3.5.3提升ListView的运行效率119

3.5.4ListView的点击事件120

3.6更强大的滚动控件——RecyclerView122

3.6.1RecyclerView的基本用法122

3.6.2实现横向滚动和瀑布流布局125

3.6.3RecyclerView的点击事件130

3.7编写界面的 实践132

3.7.1制作Nine-Patch图片132

3.7.2编写精美的聊天界面135

3.8小结与点评141

第4章手机平板要兼顾——探究碎片142

4.1碎片是什么142

4.2碎片的使用方式144

4.2.1碎片的简单用法144

4.2.2动态添加碎片147

4.2.3在碎片中模拟返回栈150

4.2.4碎片和活动之间进行通信151

4.3碎片的生命周期151

4.3.1碎片的状态和回调151

4.3.2体验碎片的生命周期153

4.4动态加载布局的技巧156

4.4.1使用限定符156

4.4.2使用 小宽度限定符159

4.5碎片的 实践——一个简易版的新闻应用160

4.6小结与点评169

第5章全局大喇叭——详解广播机制170

5.1广播机制简介170

5.2接收系统广播171

5.2.1动态注册网络变化171

5.2.2静态注册实现开机启动174

5.3发送自定义广播177

5.3.1发送标准广播177

5.3.2发送有序广播179

5.4使用本地广播183

5.5广播的 实践——实现强制下线功能185

5.6Git时间——初识版本控制工具192

5.6.1安装Git192

5.6.2创建代码仓库193

5.6.3提交本地代码195

5.7小结与点评195

第6章数据存储全方案——详解持久化技术196

6.1持久化技术简介196

6.2文件存储197

6.2.1将数据存储到文件中197

6.2.2从文件中读取数据201

6.3SharedPreferences存储203

6.3.1将数据存储到SharedPreferences中203

6.3.2从SharedPreferences中读取数据206

6.3.3实现记住密码功能208

6.4SQLite数据库存储211

6.4.1创建数据库211

6.4.2升级数据库216

6.4.3添加数据219

6.4.4更新数据222

6.4.5删除数据224

6.4.6查询数据225

6.4.7使用SQL操作数据库228

6.5使用LitePal操作数据库229

6.5.1LitePal简介229

6.5.2配置LitePal230

6.5.3创建和升级数据库231

6.5.4使用LitePal添加数据236

6.5.5使用LitePal更新数据237

6.5.6使用LitePal删除数据240

6.5.7使用LitePal查询数据241

6.6小结与点评243

第7章跨程序共享数据——探究内容提供器244

7.1内容提供器简介244

7.2运行时权限245

7.2.1Android权限机制详解245

7.2.2在程序运行时申请权限249

7.3访问其他程序中的数据254

7.3.1ContentResolver的基本用法254

7.3.2读取系统联系人256

7.4创建自己的内容提供器260

7.4.1创建内容提供器的步骤261

7.4.2实现跨程序数据共享265

7.5Git时间——版本控制工具进阶275

7.5.1忽略文件275

7.5.2查看修改内容276

7.5.3撤销未提交的修改278

7.5.4查看提交记录279

7.6小结与点评280

第8章丰富你的程序——运用手机多媒体281

8.1将程序运行到手机上281

8.2使用通知283

8.2.1通知的基本用法283

8.2.2通知的进阶技巧289

8.2.3通知的高级功能291

8.3调用摄像头和相册293

8.3.1调用摄像头拍照294

8.3.2从相册中选择照片298

8.4播放多媒体文件303

8.4.1播放音频303

8.4.2播放视频307

8.5小结与点评311

第9章看看精彩的世界——使用网络技术312

9.1WebView的用法312

9.2使用HTTP协议访问网络314

9.2.1使用HttpURLConnection315

9.2.2使用OkHttp319

9.3解析XML格式数据321

9.3.1Pull解析方式324

9.3.2SAX解析方式326

9.4解析JSON格式数据329

9.4.1使用JSONObject330

9.4.2使用GSON331

9.5网络编程的 实践334

9.6小结与点评338

第10章后台默默的劳动者——探究服务339

10.1服务是什么339

10.2Android多线程编程340

10.2.1线程的基本用法340

10.2.2在子线程中更新UI341

10.2.3解析异步消息处理机制345

10.2.4使用AsyncTask347

10.3服务的基本用法349

10.3.1定义一个服务349

10.3.2启动和停止服务352

10.3.3活动和服务进行通信355

10.4服务的生命周期359

10.5服务的更多技巧359

10.5.1使用前台服务359

10.5.2使用IntentService361

10.6服务的 实践——完整版的下载示例365

10.7小结与点评378

第11章Android特色开发——基于位置的服务379

11.1基于位置的服务简介379

11.2申请API Key380

11.3使用百度定位384

11.3.1准备LBS SDK384

11.3.2确定自己位置的经纬度386

11.3.3选择定位模式391

11.3.4看得懂的位置信息393

11.4使用百度地图395

11.4.1让地图显示出来395

11.4.2移动到我的位置397

11.4.3让“我”显示在地图上400

11.5Git时间——版本控制工具的高级用法402

11.5.1分支的用法403

11.5.2与远程版本库协作404

11.6小结与点评406

第12章 的UI体验——MaterialDesign实战407

12.1什么是Material Design407

12.2Toolbar408

12.3滑动菜单415

12.3.1DrawerLayout415

12.3.2NavigationView418

12.4悬浮按钮和可交互提示423

12.4.1FloatingActionButton424

12.4.2Snackbar427

12.4.3CoordinatorLayout428

12.5卡片式布局430

12.5.1CardView431

12.5.2AppBarLayout437

12.6下拉刷新440

12.7可折叠式标题栏443

12.7.1CollapsingToolbarLayout443

12.7.2充分利用系统状态栏空间453

12.8小结与点评456

第13章继续进阶——你还应该掌握的高级技巧457

13.1全局获取Context的技巧457

13.2使用Intent传递对象461

13.2.1Serializable方式461

13.2.2Parcelable方式463

13.3定制自己的日志工具464

13.4调试Android程序466

13.5创建定时任务469

13.5.1Alarm机制469

13.5.2Doze模式471

13.6多窗口模式编程472

13.6.1进入多窗口模式473

13.6.2多窗口模式下的生命周期475

13.6.3禁用多窗口模式479

13.7Lambda表达式481

13.8总结485

第14章进入实战——开发酷欧天气486

14.1功能需求及技术可行性分析486

14.2Git时间——将代码托管到GitHub上489

14.3创建数据库和表494

14.4遍历全国省市县数据499

14.5显示天气信息509

14.5.1定义GSON实体类509

14.5.2编写天气界面514

14.5.3将天气显示到界面上520

14.5.4获取 应每日一图526

14.6手动更新天气和切换城市532

14.6.1手动更新天气532

14.6.2切换城市535

14.7后台自动更新天气540

14.8修改图标和名称542

14.9你还可以做的事情543

第15章 后一步——将应用发布到360应用商店545

15.1生成正式签名的APK文件545

15.1.1使用Android Studio生成546

15.1.2使用Gradle生成548

15.1.3生成多渠道APK文件551

15.2申请360开发者账号554

15.3发布应用程序556

15.4嵌入广告进行盈利560

15.4.1注册腾讯广告联盟账号560

15.4.2新建媒体和广告位562

15.4.3接入广告SDK564

15.4.4重新发布应用程序569

15.5结束语570

感悟与笔记

  1. Android新增的百分比布局
    • android.support.percent.PercentFrameLayout
    • 在build.gradle下添加依赖包
    • compile 'com.android.support:percent:22.2.0'
  2. LitePal开源数据库框架
  3. 关于ListView的优化
    • 在Adapter的getView(int position,View convertView,ViewGroup parent)
    • 方法中对于ListView的优化点主要是加载xml文件以及xml文件的组件加载处性能优化。
    • 优化代码如下所示:
    • 判断convertView是否为null,如果为null那么就通过LayoutInflater.from去加载布局文件,如果不为null则不用浪费性能重新加载xml文件,同样通过findViewWithTag或者findViewById的方式获取组件依旧会出现浪费性能的情况,所以这里通过myHolder.textView这样的方式获取组件就会提高ListView的加载性能,经过这两种方式就可以大大的提供ListView的性能了。
    • public View getView(final int position, View convertView, ViewGroup parent) {
              MyHolder myHolder = null;
              if (convertView == null) {
                  convertView = LayoutInflater.from(mContext).inflate(SDKUtils.getResLayoutId(mContext, "user_item"), null);
                  myHolder = new MyHolder();
                  myHolder.textView = (TextView) convertView.findViewWithTag("account_textview");
                  myHolder.imageView = (ImageView) convertView.findViewWithTag("account_icon");
                  myHolder.delButton = (ImageView) convertView.findViewWithTag("account_del");
                  convertView.setTag(myHolder);
                  convertView.setLayoutParams(new AbsListView.LayoutParams(LayoutParams.MATCH_PARENT,
                          SDKUtils.getDimenValue(mContext, "user_item_height")));
                  if (currentAccount.getText().toString().equals(list.get(position).getUserName())) {
                      myHolder.imageView.setBackgroundResource(SDKUtils.getDrawableId(mContext, "sdk_select_account"));
                  } else {
                      myHolder.imageView.setBackgroundColor(Color.TRANSPARENT);
                  }
              } else {
                  myHolder = (MyHolder) convertView.getTag();
              }
              myHolder.textView.setText(list.get(position).getUserName());
              myHolder.delButton.setOnClickListener(new OnClickListener() {
      
      
                  @Override
                  public void onClick(View v) {
                      SDKDBManager.getInstance().creatDB(mContext);
                      SDKDBManager.getInstance().deleteAccount(list.get(position).getUserName());
                      list.remove(position);
                      notifyDataSetChanged();
                      currentAccount.setText("");
                  }
              });
              return convertView;
          }
      
      
          class MyHolder {
              public ImageView imageView;
              public TextView textView;
              public ImageView delButton;
          }
      
Copyright © 2021-2022 知识猫. All Rights Reserved.