丛书序
为什么开发深入浅出系列丛书?
目的是从读者角度写书,开发出高质量的、适合阅读的图书。
“不积跬步,无以至千里;不积小流,无以成江海。”知识的学习是一个逐渐积累的过程,只有坚持系统地学习知识,深入浅出,坚持不懈,持之以恒,才能把一类技术学习好。坚持的动力源于所学内容的趣味性和讲法的新颖性。
计算机课程的学习也有一条隐含的主线,那就是“提出问题→分析问题→建立数学模型→建立计算模型→通过各种平台和工具得到最终正确的结果”,培养计算机专业学生的核心能力是“面向问题求解的能力”。由于目前大学计算机本科生培养计划的特点,以及受教学计划和课程设置的原因,计算机科学与技术专业的本科生很难精通掌握一门程序设计语言或者相关课程。各门课程设置比较孤立,培养的学生综合运用各方面的知识能力方面有欠缺。传统的教学模式以传授知识为主要目的,能力培养没有得到充分的重视。很多教材受教学模式的影响,在编写过程中,偏重概念讲解比较多,而忽略了能力培养。为了突出内容的案例性、解惑性、可读性、自学性,本套书努力在以下方面做好工作。
1. 案例性
所举案例突出与本课程的关系,并且能恰当反映当前知识点。例如,在计算机专业中,很多高校都开设了高等数学、线性代数、概率论,不言而喻,这些课程对于计算机专业的学生来说是非常重要的,但就目前对不少高校而言,这些课程都是由数学系的老师讲授,教材也是由数学系的老师编写,由于学科背景不同和看待问题的角度不同,在这些教材中基本都是纯数学方面的案例,作为计算机系的学生来说,学习这样的教材缺少原动力并且比较乏味,究其原因,很多学生不清楚这些课程与计算机专业的关系是什么。基于此,在编写这方面的教材时,可以把计算机上的案例加入其中,例如,可以把计算机图形学中的三维空间物体图像在屏幕上的伸缩变换、平移变换和旋转变换在矩阵运算中进行举例,可以把双机热备份的案例融入马尔可夫链的讲解,可以把密码学的案例融入大数分解中,等等。
2. 解惑性
很多教材中的知识讲解注重定义的介绍,而忽略因果性、解释性介绍,往往造成知其然而不知其所以然。下面列举两个例子。
(1) 读者可能对OSI参考模型与TCP/IP参考模型的概念产生混淆,因为两种模型之间有很多相似之处。其实,OSI参考模型是在其协议开发之前设计出来的,也就是说,它不是针对某个协议族设计的,因而更具有通用性。而TCP/IP模型是在TCP/IP协议栈出现后出现的,也就是说,TCP/IP模型是针对TCP/IP协议栈的,并且与TCP/IP协议栈非常吻合。但是必须注意,TCP/IP模型描述其他协议栈并不合适,因为它具有很强的针对性。说到这里读者可能更迷惑了,既然OSI参考模型没有在数据通信中占有主导地位,那为什么还花费这么大的篇幅来描述它呢?其实,虽然OSI参考模型在协议实现方面存在很多不足,但是,OSI参考模型在计算机网络的发展过程中起到了非常重要的作用,并且,它对未来计算机网络的标准化、规范化的发展有很重要的指导意义。
〖1〗〖2〗Android软件开发教程(第2版)〖1〗丛书序〖2〗(2) 再例如,在介绍原码、反码和补码时,往往只给出其定义和举例表示,而对最后为什么在计算机中采取补码表示数值?浮点数在计算机中是如何表示的?字节类型、短整型、整型、长整型、浮点数的范围是如何确定的?下面我们来回答这些问题(以8位数为例),原码不能直接运算,并且0的原码有+0和-0两种形式,即00000000和10000000,这样肯定是不行的,如果根据原码计算设计相应的门电路,由于要判断符号位,设计的复杂度会大大增加,不合算;为了解决原码不能直接运算的缺点,人们提出了反码的概念,但是0的反码还是有+0和-0两种形式,即00000000和11111111,这样是不行的,因为计算机在计算过程中,不能判断遇到0是+0还是-0;而补码解决了0表示的唯一性问题,即不会存在+0和-0,因为+0是00000000,它的补码是00000000,-0是10000000,它的反码是11111111,再加1就得到其补码是100000000,舍去溢出量就是00000000。知道了计算机中数用补码表示和0的唯一性问题后,就可以确定数据类型表示的取值范围了,仍以字节类型为例,一个字节共8位,有00000000~11111111共256种结果,由于1位表示符号位,7位表示数据位,正数的补码好说,其范围从00000000~011111111,即0~127;负数的补码为10000000~11111111,其中,11111111为-1的补码,10000001为-127的补码,那么到底10000000表示什么最合适呢?8位二进制数中,最小数的补码形式为10000000;它的数值绝对值应该是各位取反再加1,即为01111111+1=10000000=128,又因为是负数,所以是-128,即其取值范围是-128~127。
3. 可读性
图书的内容要深入浅出,使人爱看、易懂。一本书要做到可读性好,必须做到“善用比喻,实例为王”。什么是深入浅出?就是把复杂的事物简单地描述明白。把简单事情复杂化的是哲学家,而把复杂的问题简单化的是科学家。编写教材时要以科学家的眼光去编写,把难懂的定义,要通过图形或者举例进行解释,这样能达到事半功倍的效果。例如,在数据库中,第一范式、第二范式、第三范式、BC范式的概念非常抽象,很难理解,但是,如果以一个教务系统中的学生表、课程表、教师表之间的关系为例进行讲解,从而引出范式的概念,学生会比较容易接受。再例如,在生物学中,如果纯粹地讲解各个器官的功能会比较乏味,但是如果提出一个问题,如人的体温为什么是37℃?以此为引子引出各个器官的功能效果要好得多。再例如,在讲解数据结构课程时,由于定义多,表示抽象,这样达不到很好的教学效果,可以考虑在讲解数据结构及其操作时用程序给予实现,让学生看到直接的操作结果,如压栈和出栈操作,可以把PUSH()和POP()操作实现,这样效果会好很多,并且会激发学生的学习兴趣。
4. 自学性
一本书如果适合自学学习,对其语言要求比较高。写作风格不能枯燥无味,让人看一眼就拒人千里之外,而应该是风趣、幽默,重要知识点多举实际应用的案例,说明它们在实际生活中的应用,应该有画龙点睛的说明和知识背景介绍,对其应用需要注意哪些问题等都要有提示。
一书在手,从第一页开始的起点到最后一页的终点,如何使读者能快乐地阅读下去并获得知识?这是非常重要的问题。在数学上,两点之间的最短距离是直线。但在知识的传播中,使读者感到“阻力最小”的书才是好书。如同自然界中没有直流的河流一样,河水在重力的作用下一定沿着阻力最小的路径向前进。知识的传播与此相同,最有效的传播方式是传播起来损耗最小,阅读起来没有阻力。
欢迎联系清华大学出版社白立军老师投稿: bailj@tup.tsinghua.edu.cn。
2014年12月15日
前言
随着移动互联网时代的来临,智能手机及其客户端APP软件成为广大用户接入和使用互联网的主要设备和方式之一。由谷歌公司推出的Android系统自2007年问世以来,得到了全球众多厂商和运营商的支持,迅速成为智能手机的主流操作系统,占据了大部分的市场份额。它不仅得到了全球开发者社区的极大关注,而且一大批世界一流的手机生产厂商和运营厂商都已经采用了Android系统,因此基于Android的手机APP软件开发日益受到广大开发者的关注,一些大学和培训机构也相继开设了基于Android的软件技术培训课程。这不仅合乎时代发展需要,而且有助于学生日后的就业,更能满足国内外日益增长的专业需求。
本书是在作者撰写的《深入浅出Android软件开发教程》(第1版)的基础上,听取了部分任课教师和教材使用者的修改意见,结合Android智能手机软件开发的最新发展,重新撰写的一部教材。作为一本面向初学者的教程,本书延续上一版的写作风格,注重讲解的深入浅出和易学易懂,对于一些较难理解的理论,尽可能使用图示加以说明。对每个知识点都配有示例程序,并力求示例程序短小精悍,既能帮助读者理解知识,又具有启发性和实用性,非常适合教学讲授、自学或日后作为工具资料查询。每一章都配有难度适中的习题,引导读者编写相关功能的实用程序,有助于提高读者的学习兴趣。本书特别设置了Java语言和XML的基础知识介绍,同时这部分内容还可以作为Java和XML语法简明手册使用,便于初学者在编程过程中查阅。
由于Android程序设计涉及编程语言、网络通信、硬件控制、多媒体等较多知识内容,所以学习时应该遵循循序渐进、由浅入深的原则。学习的过程中既要注重理论的理解,更要加强动手实践,尤其对于初学者,多练习才能掌握设计的方法和技巧。
本书的示例程序采用2017年6月发布的Android Studio 2.3.3开发环境调试,其安装文件版本为androidstudiobundle162.4069837windows.exe,模拟器版本为Android 8.0(API 26)。Android Studio自2013年推出以来,在几次更新之后已经成为非常稳定和强大的IDE开发环境。和基于Eclipse的编程环境相比,Android Studio具有很多优势。Android Studio以IntelliJ IDEA为基础,整合了Gradle构建工具,为开发者提供了开发和调试工具,包括智能代码编辑、用户界面设计工具、性能分析工具等。Android Studio的界面风格更受程序员欢迎,代码的修改会自动智能保存,自带了多设备的实时预览,具有内置命令行终端,具有更完善的插件系统(如Git、Markdown、Gradle等)和版本控制系统,在代码智能提示、运行响应速度等方面都更出色。
本书共分12章。第1章介绍智能移动设备及其操作系统,Android系统的体系结构,以及Java、XML等Android程序设计必要的预备知识。第2章介绍在Windows系统中搭建Android开发平台的主要步骤和集成开发环境的使用方法,并且通过学习创建第一个Android应用程序,了解典型Android应用程序的架构与组成。第3~5章介绍用户界面的设计,主要包括XML布局文件的设计和使用方法、常见的界面布局方式、Android中的事件处理机制、常用的用户界面控件以及对话框、菜单和状态栏消息的设计方法。第6章介绍Fragment的基本概念、Fragment的加载和切换以及相关应用。第7章介绍线程的概念、相关操作和Android多线程通信机制。第8章介绍Intent的概念及其在组件通信中的应用,包括Activity之间的跳转与通信、后台服务Service及其启动/停止方法、广播消息的发送和接收等。第9章介绍Android常用的数据存储和访问方法,包括Shared Preferences、文件存取、SQLite数据库存储、内容提供器(Content Provider)等。第10章介绍在Android系统中如何处理和使用音视频等多媒体资源。第11章主要介绍访问Internet资源的方法,包括利用Http、HttpURLConnection或Socket与远程服务器交互,使用WebView控件在Activity中包含一个基于WebKit浏览器的方法等。第12章介绍两个综合应用实例的设计思路和实现方法,以加深对基本知识的理解。
本书第1~6章由张雪梅编写,第7、8章由李志强编写、第9~12章由王向编写,部分章节中的实例由李志强、王向完成,最后由高凯完成了全书的统稿和审阅工作。
本书可作为大学相关专业教科书和工程实训、技能培训用书,也可供工程技术人员参考。本书提供源代码下载和教学课件下载,相关源代码和课件资源均在清华大学出版社网站(http: //www.tup.com.cn)发布,方便读者自学和实践。
在本书的写作与相关科研课题的研究工作中,得到了多方面的支持与帮助。在写作过程中,有关Android智能手机软件开发的相关网站亦为本书提供了良好的基础,我们也参考了相关文献和互联网上众多热心网友提供的素材,本书的顺利完成也得益于参阅了大量的相关工作及研究成果,在此谨向这些文献的作者、热心网友以及为本书提供帮助的老师致以诚挚的谢意和崇高的敬意。在本书的写作过程中,也得到了清华大学出版社的大力支持和帮助,在此一并表示衷心感谢。
本书读者对象包括计算机、通信、电子信息类本专科学生,以及从事手机软件开发与维护的工程技术人员。
由于作者水平有限,书中难免有不足之处,恳请广大读者批评指正。作者的联系方式是zxm@hebust.edu.cn,欢迎来信交流,共同探讨Android程序设计方面的问题。
作者
2018年5月