《Android开发艺术探索》图书勘误

第一章

  1. 在13页提到“系统只在Activity异常终止的时候才会调用onSaveInstanceState与onRestoreInstanceState来储存和恢复数据,其他情况不会触发这个过程。”这句话的描述不确切,准确点说,应该是“系统只在Activity异常终止的时候才会调用onSaveInstanceState与onRestoreInstanceState来储存和恢复数据,其他情况不会触发这个过程。但是按Home键或者启动新Activity仍然会单独触发onSaveInstanceState的调用。”
  2. 在25页中提到“最后再在MainActivity中单击按钮启动SecondActivity,现在按back键,然后看到的是哪个Activity?”这句话表达不确切,准确点说,应该是“然后按两次back键”,详情可以参考具体的分析。
  3. 第12页第一行中“在我们选择屏幕以后”,改为“当我们旋转屏幕以后”。
  4. 第28页的第一句话,“这个模式一般需要和FLAG_ACTIVITY_NEW_TASK 配合使用,在这种情况下”,改为“这个标记位一般会和singleTask启动模式一起出现,在这种情况下”。
  5. 第1.2.2小节中,Activity的Flags,这一节的内容直接翻译了Android官方文档(http://developer.android.com/guide/components/tasks-and-back-stack.html#TaskLaunchModes),但是经过实例验证,发现书中的描述不准确(或者说官方文档中的描述不准确),结论为:Flags并不能简单地等同于启动模式,这一块内容需要进一步验证。

第二章

  1. 在47页中提到“以上就是Parcelable和Serializable和区别”。此处有笔误,应该是“以上就是Parcelable和Serializable的区别”。
  2. 在47页中提到“直观来说,Binder是Android中的一个类,它继承了IBinder接口。”此处用语不严谨,应该为“它实现了IBinder接口”。
  3. 在86页中提到“其中 beginBroadcast 和 beginBroadcast 必须要配对使用,哪怕我们仅仅是想要获取 RemoteCallbackList 中的元素个数”。此处有笔误,应该是“其中 beginBroadcast 和 finishBroadcast 必须要配对使用,哪怕我们仅仅是想要获取 RemoteCallbackList 中的元素个数”。
  4. 在36页中提到“Linux上可以通过命名管道、共享内容、信号量等来进行进程间通信”,改为”Linux上可以通过命名管道、共享内存、信号量等来进行进程间通信“。
  5. 在42页中倒数第6行提到” 在 Android 中也提供了新的序列化方式,那就是 Parcelable 接口,使用 Parcelable 来实现对象的序列号。“,改为”在 Android 中也提供了新的序列化方式,那就是 Parcelable 接口,使用 Parcelable 来实现对象的序列化。“
  6. 第90页,aidl那一节,服务端和客户端如果是两个工程,则在Service的onBind方法中无法验证客户端的权限。原因是onBind方法并不是一个Binder调用,它运行在服务端的UI线程中,故在onBind中只能验证服务端的权限,然而这是没有意义的。推荐大家按照第二种方法,在onTransact方法中对客户端进行权限验证。

第三章

  1. 第132页中提到” 上面简单介绍了通过动画来移动 View 的方法,关于动画会在第 5 章中进行详细说明“,改为”上面简单介绍了通过动画来移动 View 的方法,关于动画会在第 7 章中进行详细说明“。同理,135页中的第5章也应该是第7章。
  2. 第125页中提到” ACTION_UP——手机从屏幕上松开的一瞬间。“,改为”ACTION_UP——手指从屏幕上松开的一瞬间。“
  3. 第126页中提到” 接着,当我们先知道当前的滑动速度时,这个时候可以采用如下方式来获得当前的速度“,改为”接着,当我们想知道当前的滑动速度时,这个时候可以采用如下方式来获得当前的速度“。
  4. 第138页中3.3.2小节中,应该是“以下代码可以让一个View在100ms内向右移动100像素”,向左是笔误,应该是向右。

第四章

  1. 第196页中提到” 下面我们来回答一个在 4.3.2 节中提到的问题: View 的测量宽/高和最终/宽高有什么区别?“,改为”下面我们来回答一个在 4.3.2 节中提到的问题: View 的测量宽/高和最终宽/高有什么区别?“
  2. 第207页中” mColor = a.getColor(styleable.CircleView_circle_color, Color.RED); “,改为”mColor = a.getColor(R.styleable.CircleView_circle_color, Color.RED); “
  3. 第207页中,“通过 recycle 方法来实现资源,这样 CircleView 中所做的工作就完成了。“,改为”通过 recycle 方法来释放资源,这样 CircleView 中所做的工作就完成了。“
  4. 第176页中提到” 如何得到 content 呢?可以这样:ViewGroup content= findViewById(R.android.id.content)。“,改为”如何得到 content 呢?可以这样:ViewGroup content= (ViewGroup)findViewById(android.R.id.content)。“
  5. 182页中最下面的表格里,左下方的“warap_content” 改为 “wrap_content”。
  6. 205页中的代码有误,改为:
    protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    final int paddingLeft = getPaddingLeft();
    final int paddingRight = getPaddingRight();
    final int paddingTop = getPaddingTop();
    final int paddingBottom = getPaddingBottom();
    int width = getWidth() - paddingLeft - paddingRight;
    int height = getHeight() - paddingTop - paddingBottom;
    int radius = Math.min(width, height) / 2;
    canvas.drawCircle(paddingLeft + width / 2, paddingTop + height/2, radius, mPaint);
    }
  7. 209中的代码的最后一段有误,改为:
    @Override
    protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    final int paddingLeft = getPaddingLeft();
    final int paddingRight = getPaddingRight();
    final int paddingTop = getPaddingTop();
    final int paddingBottom = getPaddingBottom();
    int width = getWidth() - paddingLeft - paddingRight;
    int height = getHeight() - paddingTop - paddingBottom;
    int radius = Math.min(width, height) / 2;
    canvas.drawCircle(paddingLeft + width / 2, paddingTop + height / 2, radius, mPaint);
    }

第六章

  1. 在250页中提到”android:endColo——渐变的结束色“,此处有笔误,应该是”android:endColor——渐变的结束色“

第七章

  1. 第278页中的代码有误,改为:android:repeatMode=[“restart” | “reverse”]
  2. 第279页中的提到“另一个是 android:repeatMode,它表示动画循环的模式,有两个选项: “repeat”和“reverse” ,分别表示连续重复和逆向重复。”,改为“另一个是 android:repeatMode,它表示动画循环的模式,有两个选项: “restart”和“reverse” ,分别表示连续重复和逆向重复。”

第九章

  1. 第336页中提到” Service 的启动过程从 ContextWrapper 的 startActivity 开始,如下所示。“,改为”Service 的启动过程从 ContextWrapper 的 startService 开始,如下所示。“
  2. 第337页中提到” 下面继续看 ContextImpl 的 startActivity 的实现,如下所示。“,改为”下面继续看 ContextImpl 的 startService的实现,如下所示。“

第十章

  1. 在372页中提到“由于Android开发规范的限制,我们并不能在主线程中访问UI控件“。此处有笔误,应该是”我们并不能在子线程中访问UI控件“。

第十三章

  1. 第468页中提到“为了更好地对多插件进行支持,需要合理地去管理各个插件的 DexClassoader “,改为”为了更好地对多插件进行支持,需要合理地去管理各个插件的 DexClassLoader “。

第十五章

  1. 在502页中提到“适当使用软引用和软引用”。此处有笔误,应该是“适当使用软引用和弱引用”。
  2. 在507页中提到”一个合理的命令风格可以让读者阅读源码就像在阅读注释一样“,此处有笔误,应该是”一个合理的命名风格可以让读者阅读源码就像在阅读注释一样“

说明

欢迎大家向我反馈勘误信息,在本文下面留言即可,我会更新在本文中。所有的勘误将会在本书重印时予以修正,所以希望大家多多向我反馈勘误信息。

注意:本文正文以及留言中所有的勘误都将在《Android开发艺术探索》第四次印刷时全部修正。
PS:最近很多同学问我哪里可以购买到第四次印刷的书,其实目前市面上都是四次印刷以后的书了,只是京东等网站懒得更新图书信息而已,所以大家勇敢地购买吧!

书中源代码下载

https://github.com/singwhatiwanna/android-art-res

  • 欢迎大家加入我的知识星球,一起学习交流
    cover
目录 第1章 Activity的生命周期和启动模式 / 1 1.1 Activity的生命周期全面分析 / 1 1.1.1 典型情况下的生命周期分析 / 2 1.1.2 异常情况下的生命周期分析 / 8 1.2 Activity的启动模式 / 16 1.2.1 Activity的Launch Mode / 16 1.2.2 Activity的Flags / 27 1.3 Intent Filter的匹配规则 / 28 第2章 IPC机制 / 35 2.1 Android IPC简介 / 35 2.2 Android中的多进程模式 / 36 2.2.1 开启多进程模式 / 36 2.2.2 多进程模式的运行机制 / 39 2.3 IPC基础概念介绍 / 42 2.3.1 Serializable接口 / 42 2.3.2 Parcelable接口 / 45 2.3.3 Binder / 47 2.4 Android中的IPC方式 / 61 2.4.1 使用Bundle / 61 2.4.2 使用文件共享 / 62 2.4.3 使用Messenger / 65 2.4.4 使用AIDL / 71 2.4.5 使用 Content Provider / 91 2.4.6 使用Socket / 103 2.5 Binder连接池 / 112 2.6 选用合适的IPC方式 / 121 第3章 View的事件体系 / 122 3.1 View基础知识 / 122 3.1.1 什么是View / 123 3.1.2 View的位置参数 / 123 3.1.3 Motion Event和Touch Slop / 125 3.1.4 VelocityT racker、Gesture Detector和Scroller / 126 3.2 View的滑动 / 129 3.2.1 使用scroll To/scroll By / 129 3.2.2 使用动画 / 131 3.2.3 改变布局参数 / 133 3.2.4 各种滑动方式的对比 / 133 3.3 弹性滑动 / 135 3.3.1 使用Scroller / 136 3.3.2 通过动画 / 138 3.3.3 使用延时策略 / 139 3.4 View的事件分发机制 / 140 3.4.1 点击事件的传递规则 / 140 3.4.2 事件分发的源码解析 / 144 3.5 View的滑动冲突 / 154 3.5.1 常见的滑动冲突场景 / 155 3.5.2 滑动冲突的处理规则 / 156 3.5.3 滑动冲突的解决方式 / 157 第4章 View的工作原理 / 174 4.1 初识View Root和Decor View / 174 4.2 理解Measure Spec / 177 4.2.1 Measure Spec / 177 4.2.2 Measure Spec和Layout Params的对应关系 / 178 4.3 View的工作流程 / 183 4.3.1 measure过程 / 183 4.3.2 layout过程 / 193 4.3.3 draw过程 / 197 4.4 自定义View / 199 4.4.1 自定义View的分类 / 200 4.4.2 自定义View须知 / 201 4.4.3 自定义View示例 / 202 4.4.4 自定义View的思想 / 217 第5章 理解Remote Views / 218 5.1 Remote Views的应用 / 218 5.1.1 Remote Views在通知栏上的应用 / 219 5.1.2 Remote Views在桌面小部件上的应用 / 221 5.1.3 Pending Intent概述 / 228 5.2 Remote Views的内部机制 / 230 5.3 Remote Views的意义 / 239 第6章 Android的Drawable / 243 6.1 Drawable简介 / 243 6.2 Drawable的分类 / 244 6.2.1 Bitmap Drawable / 244 6.2.2 Shape Drawable / 247 6.2.3 Layer Drawable / 251 6.2.4 State List Drawable / 253 6.2.5 Level List Drawable / 255 6.2.6 Transition Drawable / 256 6.2.7 Inset Drawable / 257 6.2.8 Scale Drawable / 258 6.2.9 Clip Drawable / 260 6.3 自定义Drawable / 262 第7章 Android动画深入分析 / 265 7.1 View动画 / 265 7.1.1 View动画的种类 / 265 7.1.2 自定义View动画 / 270 7.1.3 帧动画 / 272 7.2 View动画的特殊使用场景 / 273 7.2.1 LayoutAnimation / 273 7.2.2 Activity的切换效果 / 275 7.3 属性动画 / 276 7.3.1 使用属性动画 / 276 7.3.2 理解插值器和估值器 / 280 7.3.3 属性动画的监听器 / 282 7.3.4 对任意属性做动画 / 282 7.3.5 属性动画的工作原理 / 288 7.4 使用动画的注意事项 / 292 第8章 理解Window和Window Manager / 294 8.1 Window和Window Manager / 294 8.2 Window的内部机制 / 297 8.2.1 Window的添加过程 / 298 8.2.2 Window的删除过程 / 301 8.2.3 Window的更新过程 / 303 8.3 Window的创建过程 / 304 8.3.1 Activity的Window创建过程 / 304 8.3.2 Dialog的Window创建过程 / 308 8.3.3 Toast的Window创建过程 / 311 第9章 四大组件的工作过程 / 316 9.1 四大组件的运行状态 / 316 9.2 Activity的工作过程 / 318 9.3 Service的工作过程 / 336 9.3.1 Service的启动过程 / 336 9.3.2 Service的绑定过程 / 344 9.4 Broadcast Receiver的工作过程 / 352 9.4.1 广播的注册过程 / 353 9.4.2 广播的发送和接收过程 / 356 9.5 Content Provider的工作过程 / 362 第10章 Android的消息机制 / 372 10.1 Android的消息机制概述 / 373 10.2 Android的消息机制分析 / 375 10.2.1 Thread Local的工作原理 / 375 10.2.2 消息队列的工作原理 / 380 10.2.3 Looper的工作原理 / 383 10.2.4 Handler的工作原理 / 385 10.3 主线程的消息循环 / 389 第11章 Android的线程和线程池 / 391 11.1 主线程和子线程 / 392 11.2 Android中的线程形态 / 392 11.2.1 Async Task / 392 11.2.2 Async Task的工作原理 / 395 11.2.3 Handler Thread / 402 11.2.4 Intent Service / 403 11.3 Android中的线程池 / 406 11.3.1 Thread Pool Executor / 407 11.3.2 线程池的分类 / 410 第12章 Bitmap的加载和Cache / 413 12.1 Bitmap的高效加载 / 414 12.2 Android中的缓存策略 / 417 12.2.1 Lru Cache / 418 12.2.2 Disk Lru Cache / 419 12.2.3 Image Loader的实现 / 424 12.3 Image Loader的使用 / 441 12.3.1 照片墙效果 / 441 12.3.2 优化列表的卡顿现象 / 446 第13章 综合技术 / 448 13.1 使用Crash Handler来获取应用的crash信息 / 449 13.2 使用multidex来解决方法数越界 / 455 13.3 Android的动态加载技术 / 463 13.4 反编译初步 / 469 13.4.1 使用dex2jar和jd—gui反编译apk / 470 13.4.2 使用apktool对apk进行二次打包 / 470 第14章 JNI和NDK编程 / 473 14.1 JNI的开发流程 / 474 14.2 NDK的开发流程 / 478 14.3 JNI的数据类型和类型签名 / 484 14.4 JNI调用Java方法的流程 / 486 第15章 Android性能优化 / 489 15.1 Android的性能优化方法 / 490 15.1.1 布局优化 / 490 15.1.2 绘制优化 / 493 15.1.3 内存泄露优化 / 493 15.1.4 响应速度优化和ANR日志分析 / 496 15.1.5 List View和Bitmap优化 / 501 15.1.6 线程优化 / 501 15.1.7 一些性能优化建议 / 501 15.2 内存泄露分析之MAT工具 / 502 15.3 提高程序的可维护性 / 506
评论 397
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

singwhatiwanna

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值