书名:Android从入门到精通
ISBN:978-7-115-41536-3
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
• 编 著 巅峰卓越
责任编辑 张 翼
• 人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
• 读者服务热线:(010)81055410
反盗版热线:(010)81055315
本书以零基础讲解为宗旨,用实例引导读者学习,深入浅出地介绍了Andriod开发的相关知识和实战技能。
本书第1篇【基础知识】主要讲解Android开发环境的搭建方法和应用开发基础知识等内容;第2篇【核心技术】主要讲解UI界面布局、核心组件、事件处理、Activity界面表现、Intent和IntentFilter、Service和Broadcast Receiver、应用资源管理机制、数据存储等内容;第3篇【典型应用】主要讲解图形图像、音频、视频、网络数据处理、GPS地图定位等内容;第4篇【知识进阶】主要讲解Android传感器、蓝牙数据传输、Google Now和Android Wear、网页、OpenGL ES三维图形处理等内容;第5篇【综合实战】主要介绍象棋游戏、音乐播放器和网络流量防火墙系统等的开发方法。
本书所附DVD多媒体教学光盘中包含了与图书内容全程同步的教学录像。此外,还赠送了大量相关学习资料,以便读者扩展学习。
本书适合任何想学习Android开发的读者,无论读者是否从事计算机相关行业,是否接触过Android,均可通过本书的学习快速掌握Android开发的方法和技巧。
国家863软件专业孵化器建设是“十五”初期由国家科技部推动、地方政府实施的一项重要的产业环境建设工作,围绕“推广应用863技术成果,孵化人、项目和企业”主题,在国家高技术发展研究计划(“863”计划)和地方政府支持下建立了服务软件产业发展的公共技术支撑平台体系。国家863软件孵化器各基地以“孵小扶强”为目标,在全国不同区域开展了形式多样的软件孵化工作,取得了较大的影响力和服务成效,特别是在软件人才培养方面,各基地做了许多有益探索。其中,设在郑州的国家“863”中部软件孵化器连续举办了四届青年软件设计大赛,引起了当地社会各界的广泛关注,并通过开展校企合作,以软件工程技术推广、软件国际化为背景,培养了一大批实用软件人才。
目前,我国大专院校每年都招收数以万计的计算机或者软件专业学生,这其中除了一部分毕业生继续深造攻读研究生学位之外,大多数都要直接走上工作岗位。许多学生在毕业后求职时,都面临着缺乏实际软件开发技能和经验的问题。解决这一问题,需要大专院校与企业界的密切合作,学校教学在注重基础的同时,应适当加强产业界当前主流技术的传授,产业界也可将人才培养、人才发现工作前置到学校教学活动中。国家“863”软件专业孵化器与大学、企业都有广泛合作,在开展校企合作、培养软件人才方面具有得天独厚的条件。当然,做好这些工作还有许多问题需要研究和探索,如校企合作方式、培养模式、课程设计与教材体系等。
欣闻由国家863中部软件孵化器组织编写的“从入门到精通”丛书即将面市,内容除涵盖目前主流技术知识和开发工具之外,更融汇了其多年从事大学生软件职业技术教育的经验,可喜可贺。作为计算机软件研究和教学工作者,我衷心希望这套丛书的出版能够为广大青年学子提供切实有效的帮助,能够为我国软件人才培养做出新的贡献。
北京大学信息科学技术学院院长 梅宏
2010年3月12日
本书是专门为初学者量身打造的一本编程学习用书,由知名计算机图书策划机构“巅峰卓越”精心策划而成。
本书主要面向Android开发的初学者和爱好者,旨在帮助读者掌握Android开发基础知识,了解开发技巧并积累一定的项目实战经验。
荀子曰:不闻不若闻之,闻之不若见之,见之不若知之,知之不若行之。
实践对于学习的重要性由此可见一斑。纵观当前编程图书市场,理论知识与实践经验的脱节,是很多Android开发图书的写照。为了杜绝这一现象,本书立足于实践,从项目开发的实际需求入手,将理论知识与实际应用相结合。目标就是让初学者能够快速成长为初级程序员,并获得一定的项目开发经验,从而在职场中拥有一个高起点。
本书总结了作者多年的教学实践经验,为读者设计了最佳的学习路线。
Android系统自2008年9月发布第一个版本以来,截至2016年5月一共发布了十多个版本,其升级速度非常快。如果开发者过于追求新版本,往往会力不从心。所以在此建议广大读者不必追求最新的版本,我们只需关注最流行的版本即可。据官方统计,截至2016年5月12日,占据前三位的版本分别是Android 5.0、Android 4.4和Android 4.0,其实这三个版本的区别并不是很大,只是在某领域的细节上进行了更新。本书中使用的版本是Android 5.0。
Eclipse作为优秀的Android开发工具一直被业界人士所认可,它实现了Java开发者向Android开发者的顺利过渡。本书中的实例将以Eclipse环境为主,这样做的好处是帮助初学者以更快的速度上手学习Android开发。但是从Android 6.0开始,谷歌公司不再对Eclipse环境提供任何技术支持,而是主推Android Studio开发环境,所以本书作者为广大读者提供了详细的Android Studio学习教程及案例源码,这些资料都放在了本书的配套光盘中。此外,本书中的所有实例都提供了Eclipse和Android Studio双环境源码,帮助广大读者顺利完成学习。
► 零基础、入门级的讲解
无论读者是否从事计算机相关行业,是否接触过 Android 开发,是否开发过 Android 项目,都能从本书中找到最佳起点。
► 超多、实用、专业的范例和项目
本书彻底摒弃枯燥的理论和简单的说教,注重实用性和可操作性,结合实际工作中的范例,逐一讲解 Android 开发所需的各种知识和技术。最后,还以实际开发项目来总结本书所学内容,帮助读者在实战中掌握知识,轻松拥有项目经验。
► 随时检测自己的学习成果
每章首页罗列了“本章要点”,以便读者明确学习方向。每章最后的“实战练习”则根据所在章的知识点精心设计而成,读者可以随时自我检测,巩固所学知识。
► 细致入微、贴心提示
本书在讲解过程中使用了“提示”“注意”“技巧”等小栏目,帮助读者在学习过程中更清楚地理解基本概念,掌握相关操作,并轻松获取实战技能。
► 11小时全程同步教学录像
涵盖本书所有知识点,详细讲解每个范例及项目的开发过程及关键点,帮助读者更轻松地掌握书中所有的 Android 开发知识。
► 超多王牌资源大放送
赠送大量超值资源,包括7小时HTML5 + CSS + JavaScript实战教学录像、157个HTML+CSS+ JavaScript前端开发实例、571个典型实战模块、184个Android开发常见问题/实用技巧及注意事项、Android Studio实战电子书、CSS 3从入门到精通电子书及案例代码、HTML5从入门到精通电子书及案例代码,以及配套的教学用PPT课件等。
没有任何移动开发基础的初学者和编程爱好者
有一定的Android开发基础,想精通Android开发的人员
有一定的Android开发基础,缺乏Android开发项目经验的从业者
大专院校及培训学校相关专业的老师和学生
01.光盘运行后会首先播放带有背景音乐的光盘主界面,其中包括【配套源码】、【配套视频】、【配套PPT】、【赠送资源】和【退出光盘】5个功能按钮。
02.单击【配套源码】按钮,可以进入本书源码文件夹,里面包含了“Android Studio版本源码”、“Eclipse版本源码”和“课后练习”三个子文件夹,如下左图所示。
03.单击【配套视频】按钮,可在打开的文件夹中看到本书的配套视频教学录像子文件夹,如下右图所示。
04.单击【配套PPT】按钮,可以查看本书的配套教学用PPT课件,如下左图所示。
05.单击【赠送资源】按钮,可以查看本书赠送的超值学习资源,如下右图所示。
06.单击【退出光盘】按钮,即可退出本光盘系统。
本书由巅峰卓越策划,张明星任主编,编写了全部第0章至第23章。参加资料整理的人员有周秀、付松柏、邓才兵、钟世礼、谭贞军、张加春、王教明、万春潮、郭慧玲、侯恩静、程娟、王文忠、陈强、何子夜、李天祥、周锐、朱桂英、张元亮、张韶青、秦丹枫等。
由于编者水平有限,纰漏和不尽如人意之处在所难免,诚请读者提出意见或建议,以便修订并使之更臻完善。若读者在学习过程中遇到困难或疑问,或有任何建议,可发送电子邮件至 zhangyi@ptpress.com.cn。
编 者
2016年7月
本章视频教学录像:24分钟
Android是IT界巨头谷歌(Google)公司推出的一款运行于手机和平板电脑等设备的智能操作系统,其功能十分强大。自从2007年推出到现在,Android系统手机一直稳居全球智能手机市场占有率前列。本章将简单介绍学习Android开发前需要了解的知识,为读者后面的学习打下基础。
本章要点(已掌握的在方框中打钩)
□ 移动智能设备系统发展现状
□ Android系统基础
□ 移动开发与传统PC开发的差异
□ Android应用开发学习路线图
本节视频教学录像:8分钟
在Android系统诞生之前,智能手机这个新鲜事物大大丰富了人们的生活,得到了广大手机用户的青睐。各大手机厂商在市场和消费者用户需求的驱动之下,纷纷建立了各种智能手机操作系统,并且大肆招兵买马来抢夺市场份额,Android系统就是在这个风起云涌的历史背景下诞生的。在了解Android这款神奇的系统之前,将首先了解当前移动智能设备系统的发展现状。
智能手机是指具有像个人电脑那样强大的功能,拥有独立的操作系统,用户可以自行安装应用软件、游戏等第三方服务商提供的程序,并且可以通过移动通信网络接入到无线网络中的手机。在Android系统诞生之前已经有很多优秀的智能手机产品,例如Symbian系列和微软的Windows Mobile系列等。
对于初学者来说,可能还不知道怎样来区分什么是智能手机。某大型专业统计站点曾经对智能手机的问题做过一项市场调查,经过大众讨论并投票之后,总结出了智能手机所必须具备的功能标准,下面是当时投票后得票率最高的前5个选项。
(1)操作系统必须支持新应用的安装;
(2)高速度处理芯片;
(3)支持播放式的手机电视;
(4)大存储芯片和存储扩展能力;
(5)支持GPS导航。
根据大众投票结果,手机联盟制定了一个标准,并以这个标准为基础,总结出了如下智能手机的主要特点。
(1)具备普通手机的全部功能,例如可以进行正常的通话和发短信等手机应用;
(2)是一个开放性的操作系统,在系统平台上可以安装更多的应用程序,从而实现功能的无限扩充;
(3)具备上网功能;
(4)具备PDA的功能,实现个人信息管理,日程记事,任务安排,多媒体应用,浏览网页;
(5)可以根据个人需要扩展机器的功能;
(6)扩展性能强,并且可以支持很多第三方软件。
随着科技的进步和发展,智能手机被归纳到移动智能设备当中。移动智能设备还包含了平板电脑、游戏机和笔记本电脑等。
(1)Symbian
Symbian作为昔日智能手机的王者,在2005年至2010年曾一度独领风骚,很多人用的都是诺基亚的Symbian手机,从N70、N73、N78到N97,诺基亚N系列曾经被称为“N=无限大”的手机。对硬件的要求水平低,操作简单,省电,软件资源多是当时Symbian系统手机的重要特点。
在国内软件开发市场内,基本每一个软件都会有对应的Symbian手机版本。而Symbian开发之初的目标是要保证在较低资源的设备上能长时间稳定可靠地运行,这导致了Symbian的应用程序开发有着较为陡峭的学习曲线,开发成本较高。但是程序的运行效率很高。例如诺基亚5800有128MB的内存,后台可以同时运行10几个程序而操作流畅(多任务功能是非常强大的),即使几天不关机它的剩余内存也能够保持稳定。
由于对新兴的社交网络和Web 2.0内容支持欠佳,Symbian占智能手机的市场份额日益萎缩。2010年末,其市场占有量已被Android超过。自2009年底开始,包括摩托罗拉、三星电子、LG、索尼爱立信等各大厂商纷纷宣布终止Symbian平台的研发,转而投入Android领域。2011年初,诺基亚宣布与微软成立战略联盟,推出基于Windows Phone的智能手机,从而在事实上放弃了经营多年的Symbian,Symbian退市成为定局。
(2)iOS
iOS作为苹果移动设备iPhone和iPad的操作系统,在App Store的推动之下,成为了世界上引领潮流的操作系统之一。原本这个系统名为“iPhone OS”,直到2010年6月7日WWDC大会上宣布改名为“iOS”。iOS的用户界面的概念基础是能够使用多点触控直接操作。控制方法包括滑动、轻触开关及按键。与系统交互包括滑动(Swiping)、轻按(Tapping)、挤压(Pinching,通常用于缩小)及反向挤压(Reverse Pinching或Unpinching,通常用于放大)。此外通过其自带的加速器,可以令其旋转设备改变其y轴以令屏幕改变方向,这样的设计令iPhone更便于使用。
(3)Windows Phone
早在2004年时,微软就开始以“Photon”的计划代号开始研发Windows Mobile的一个重要版本更新。直到2008年,在iOS和Android的巨大冲击之下,微软重新组织了Windows Mobile的小组,并继续开发一个新的行动操作系统。
Windows Phone(WP),是微软发布的一款手机操作系统,它将微软旗下的Xbox Live游戏、Xbox Music音乐与独特的视频体验集成至手机中。微软公司于2010年10月11日晚上9点30分正式发布了智能手机操作系统Windows Phone,并将其使用接口称为“Modern”接口。2011年2月,“诺基亚”与微软达成全球战略同盟并深度合作共同研发。2011年9月27日,微软发布Windows Phone 7.5。2012年6月21日,微软正式发布Windows Phone 8,采用和Windows 8相同的Windows NT内核,同时也针对市场的Windows Phone 7.5发布Windows Phone 7.8。现有Windows Phone 7手机都无法升级至Windows Phone 8。截止到本书截稿日期,Windows Phone系统的最新版本是Windows Phone 10预览版。
(4)BlackBerry系统
BlackBerry系统,即黑莓系统,是加拿大Research In Motion(RIM)公司推出的一种无线手持邮件解决终端设备的操作系统,由RIM自主开发。它和其他手机终端使用的Symbian、Windows Mobile、iOS等操作系统有所不同,BlackBerry系统的加密性能更强,更安全。
安装有BlackBerry系统的黑莓机,指的不单单只是一台手机,而是由RIM公司所推出,包含服务器(邮件设定)、软件(操作接口)以及终端(手机)大类别的Push Mail实时电子邮件服务。黑莓赖以成功的最重要原则——针对高级白领和企业人士,提供企业移动办公的一体化解决方案。企业有大量的信息需要即时处理,出差在外时,也需要一个无线的可移动的办公设备。企业只要装一个移动网关,一个软件系统,用手机的平台实现无缝链接,无论何时何地,员工都可以用手机进行办公。它最大方便之处是提供了邮件的推送功能,即由邮件服务器主动将收到的邮件推送到用户的手持设备上,而不需要用户频繁地连接网络查看是否有新邮件。
黑莓系统稳定性非常优秀,它独特的定位也深得商务人士的青睐。可是也因此在大众市场上不占据优势,国内用户和应用资源也较少。
本节视频教学录像:10分钟
Android一词最早出现于法国作家利尔·亚当在1886年发表的科幻小说《未来的夏娃》中,他将外表像人的机器起名为Android。本书的主角就是Android系统,本节将简要介绍Android系统的发展概况和优势。
IDC(世界著名数据统计公司)分析称,2015年Android手机出货量达到11.5亿部,同比增长8.5%,占全球智能手机市场份额的79.4%;苹果公司iOS系统手机2015年出货量达2.73亿部,同比增长23%,占全球智能手机市场份额的16.4%,位居第二;Windows Phone手机出货量达到4680万部,占据全球智能手机市场份额的3.2%,同比增长最高达到34.1%。
虽然Android系统手机占据的市场份额比较大,但是Android版本数量较多,市面上同时存在着1.6、2.0、3.0、4.4、5.0和6.0等各种版本的Android系统手机,应用软件对各版本系统的兼容性对程序开发人员是一种不少的挑战。同时由于开发门槛低,导致应用数量虽然很多,但是应用质量参差不齐,甚至出现不少恶意软件,导致一些用户受到损失。同时Android没有对各厂商在硬件上进行限制,导致一些用户在低端机型上体验不佳。另一方面,因为Android的应用主要使用Java语言开发,其运行效率和硬件消耗一直是其他手机用户所诟病的问题。
因为Android系统的免费和开源,以及系统本身强大的功能性,使得Android系统不仅被用于手机设备上,而且也被广泛用于其他职能设备中。接下来将简要介绍除了手机产品之外,常见的搭载Android系统的智能设备。
(1)Android智能电视
Android智能电视,顾名思义是搭载了安卓操作系统的电视,使得电视智能化,能让电视机实现网页浏览、视频电影观看、聊天、办公、游戏等与平板电脑和智能手机一样的功能。Android智能电视凭借安卓系统让电视实现智能化的提升,数十万款安卓市场的应用、游戏等内容随意安装。例如海尔的模卡(MOOKA) 电视 U42H7030便是一款搭载Android 4.2系统的智能电视。
(2)Android机顶盒
Android机顶盒是指像智能手机一样,具有全开放式平台,搭载了安卓操作系统,可以由用户自行安装和卸载软件、游戏等第三方服务商提供的程序,通过此类程序来不断对电视的功能进行扩充,并可以通过网线、无线网络来实现上网冲浪的新一代机顶盒的总称。
通过使用Android机顶盒,可以让电视具有上网、看网络视频、玩游戏、看电子书、听音乐等功能,使电视成为一个低成本的平板电脑。Android机顶盒不仅仅是一个高清播放器,更具有一种全新的人机交互模式,既区别于计算机,又有别于触摸屏。Android机顶盒配备红外感应条,遥控器一般采用空中飞鼠,这样就可以方便地实现触摸屏上的各种单点操作,可以方便地在电视上玩“愤怒的小鸟”“植物大战僵尸”等经典游戏。例如乐视公司的Letv机顶盒便是基于Android打造的。
(3)游戏机
Android游戏机就像Android智能手表一样,在2013年出现了爆炸式增长。在CES展会上, NVIDIA的Project SHIELD掌上游戏主机以绝对震撼的姿态亮相,之后又有OUYA 和 GameStick相继推出。不久后,Mad Catz也发布了一款Andriod游戏机。
(4)智能手表
智能手表是将手表内置智能化系统。搭载智能手机系统而连接于网络,从而实现多功能,能同步手机中的电话、短信、邮件、照片、音乐等,如图0-1所示。
图0-1 搭载Android Wear系统的G Watch
(5)智能家居
智能家居是以住宅为平台,利用综合布线技术、网络通信技术、 智能家居-系统设计方案安全防范技术、自动控制技术、音视频技术将家居生活有关的设施集成,构建高效的住宅设施与家庭日程事务的管理系统,提升家居安全性、便利性、舒适性、艺术性,并实现环保节能的居住环境。
智能家居是在互联网的影响之下物联化体现。智能家居通过物联网技术将家中的各种设备(如音视频设备、照明系统、窗帘控制、空调控制、安防系统、数字影院系统、网络家电以及三表抄送等)连接到一起,提供家电控制、照明控制、窗帘控制、电话远程控制、室内外遥控、防盗报警、环境监测、暖通控制、红外转发以及可编程定时控制等多种功能和手段。与普通家居相比,智能家居不仅具有传统的居住功能,兼备建筑、网络通信、信息家电、设备自动化,集系统、结构、服务、管理为一体的高效、舒适、安全、便利、环保的居住环境,提供全方位的信息交互功能。帮助家庭与外部保持信息交流畅通,优化人们的生活方式,有助于人们有效安排时间,增强家居生活的安全性,甚至为各种能源费用节约资金。
例如,乐得威公司的GW-9311 智能主机产品便是一款Android智能家居产品,如图0-2所示。
图0-2 乐得威公司的GW-9311 智能主机
上述智能设备只是冰山一角,随着物联网和云服务的普及和发展,将有更多的智能设备诞生。到那个时候,Android系统更是大显身手,给人们带来一个更美好的未来。
为什么Android能在这么多的智能系统中脱颖而出,成为市场占有率第一的手机系统呢?要想分析其原因,需要先了解它的巨大优势,分析究竟是哪些优点吸引了厂商和消费者的青睐。接下来将对上述问题一一解答。
(1)系出名门
Android出身于Linux世家,是一款开源的手机操作系统。Android功成名就之后,各大通信巨头公司手机联盟纷纷加入,这个联盟由包括中国移动、摩托罗拉、高通、HTC和T-Mobile在内的30多家技术和无线应用的领军企业组成。通过与运营商、设备制造商、开发商和其他有关各方结成深层次的合作伙伴关系,希望借助建立标准化、开放式的移动电话软件平台,在移动产业内形成一个开放式的生态系统。
(2)强大的开发团队
Android的研发队伍阵容强大,包括摩托罗拉、Google、HTC、PHILIPS、T-Mobile、高通、魅族、三星、LG以及中国移动在内的34家企业,这都是在手机市场中享誉盛名的大公司。它们都将基于该平台开发手机的新型业务,应用之间的通用性和互联性将在最大程度上得到保持。并且还成立了手机开放联盟,联盟中的成员名单如下所示。
台湾宏达国际电子(HTC)(Palm等多款智能手机的代工厂)、摩托罗拉(美国最大的手机制造商)、韩国三星电子(仅次于诺基亚的全球第二大手机制造商)、韩国LG电子、中国移动(全球最大的移动运营商)、日本KDDI(2900万用户)、日本NTT DoCoMo(5200万用户)、美国Sprint Nextel(美国第三大移动运营商,5400万用户)、意大利电信(Telecom Italia)(意大利主要的移动运营商,3400万用户)、西班牙Telefónica (在欧洲和拉丁美洲有1.5亿用户)、T-Mobile(德意志电信旗下公司,在美国和欧洲有1.1亿用户)。
Audience Corp(声音处理器公司)、Broadcom Corp(无线半导体主要提供商)、英特尔(Intel)、Marvell Technology Group、Nvidia(图形处理器公司)、SiRF(GPS技术提供商)、Synaptics(手机用户界面技术)、德州仪器(Texas Instruments)、高通(Qualcomm)、惠普(Hewlett-Packard Development Company,L.P,HP)。
Aplix、Ascender、eBay的Skype、Esmertec、Living Image、NMS Communications、Noser Engineering AG、Nuance Communications、PacketVideo、SkyPop、Sonix Network、TAT-The Astonishing Tribe、Wind River Systems。
(3)诱人的奖励机制
谷歌为了提高程序员们的开发积极性,不但为他们提供了一流硬件的设置,提供了一流的软件服务,而且还提出了振奋人心的奖励机制,例如定期召开开发比赛,用创意和应用夺魁的程序员将会得到重奖。
在Android平台上,程序员可以开发出各式各样的应用。Android应用程序是通过Java语言开发的,只要具备Java开发基础,就能很快地上手并掌握。作为单独的Android开发,对Java编程经验要求并不高,即使没有编程经验的门外汉,也可以在突击学习Java之后学习Android。另外,Android完全支持2D、3D和数据库,并且和浏览器实现了集成。所以通过Android平台,程序员可以迅速、高效地开发出功能强大的应用,例如常见的工具、管理、互联网和游戏等。
为了吸引更多的用户使用Android开发,谷歌公司已经成功举办了奖金为1000万美元的开发者竞赛。鼓励开发人员创建出创意十足、十分有用的软件。这种大赛对于开发人员来说,不但能练习自己的开发水平,并且高额的奖金也是学员们学习的动力。
为了能让Android平台吸引更多的关注,谷歌开发了自己的Android软件下载店Android Market,允许开发人员将应用程序在上面发布,也允许Android用户随意下载获取自己喜欢的程序。作为开发者,需要申请开发者账号,申请后才能将自己的程序上传到Android Market,并且可以对自己的软件进行定价。所以只要开发者的软件程序足够吸引人,就可以获得很好的金钱回报,从而达到学习、赚钱两不误。
(4)开源
开源意味着对开发人员和手机厂商来说,Android是完全无偿免费使用的。因为源代码公开的原因,所以吸引了全世界各地无数程序员。于是很多手机厂商都纷纷采用Android作为自己产品的系统,包括很多山寨厂商。因为免费,所以降低了成本,提高了利润。而对于开发人员来说,众多厂商的采用就意味着人才需求大,所以纷纷加入到Android开发大军中来。于是有一些干的还可以的程序员禁不住高薪的诱惑,都纷纷改行做Android开发。以至于很多觉得现状不尽如人意的程序员,就更加坚定了“改行做Android手机开发”,目的是想寻找自己程序员生涯的转机。并且也有很多遇到发展瓶颈的程序员加入到 Android阵营中,因为这样可以学习一门新技术,使自己的未来更加有保障。
本节视频教学录像:4分钟
对于广大开发者来说,最关心的是代码编写方面的差异。其实从写代码的角度来说,传统开发跟手机开发没有什么太大区别,区别在于传统开发代码比手机代码好用的多,手机相对比较小一点,相对规模单一点。从用户体验的重要性而言,对手机这样一个随身设备的要求比较高。对于现在比较流行的手持设备来说,整个操作因为都是用手来完成的,所以用户体验上的要求会比桌面软件高很多。桌面软件在很多层次上是一些非常简单的标准按纽,可以用鼠标点击。一般不用考虑太多,有一些多媒体考虑多一些,但是在手机应用上面,用户体验永远是考虑的第一重点。从操作系统层面,或者说操作系统服务型上差异来说,移动开发跟桌面操作系统没有太大差别。但是如果在这个操作系统上运行程序,在手机上还是受到比在桌面上更多限制,除了屏幕大小限制,内存大小、处理器速度等都是在写代码的时候必须要考虑的。因为手机很难达到现在桌面所能达到的处理能力以及内存使用能力。
从传统软件开发来说,和移动软件开发其实有很多相同的地方,对于一些编程的思路,例如如何精简代码,如何让自己的程序更加有效率,更加高效地运行,是非常非常重要的。但是,对于移动开发来说,这一点比传统软件开发更为重要,因为开发是在受限的条件下进行的。比如原来做传统软件开发的时候,主要考虑的是架构和框架,当选择好一个扩展性非常强的框架后,基本上所引发的性能问题都可以通过加台机器、加内存或加硬盘的方法解决。但是移动开发是在很小的手机上运行的,内存和处理器等硬件资源是有限的,此时就需要着重考虑效率的问题,考虑我们的编码会不会导致前台运行效率降低。
从Android开发角度来说,和传统PC开发的主要差异如下所示。
(1)屏幕大小多种多样
Android开发需要面对的硬件屏幕大小是多种多样的,小的有3英寸左右,大的有5.5英寸,另外还有更大的平板产品。此时开发者需要充分考虑界面布局的问题,确保应用程序能够在不同屏幕上完整运行。而为传统PC开发的软件是在计算机上运行的,主流屏幕大小没有移动设备的繁多。
(2)更加注重运行效率
随着硬件技术的发展,传统PC机的配置越来越高,一般的应用程序都可以畅通无阻地运行。只有在并发性和访问性比较高的领域中,架构师们才会着重考虑程序的性能问题。而在移动设备领域中,尽管硬件配置也是逐年提高的,但是其配置还是远远落后于PC机,所以在开发任何Android应用程序时,一定要考虑程序的运行效率,尽力做到最高效。
(3)门槛更高
和传统PC开发相比,Android开发的门槛比较高,学好Android开发的最基本前提是先掌握传统PC开发的基本技能。例如Android应用开发不但要求掌握Java开发技术(这属于传统PC开发的技能),而且还需要学习Android所独有的控件、事件处理机制、传感器、媒体处理和通信等API。如果要进行Android底层和硬件方面的开发工作,需要十分精通C和C++技术,并且需要具备驱动移植方面的开发经验。
在当前的市面中,智能手机的屏幕尺寸主要包括如下的几种标准。
128像素×160像素
176像素×220像素
240像素×320像素
320像素×480像素
400像素×800像素
480像素×800像素
960像素×800像素
1080像素×1920像素
就手机的尺寸而言,Android给出了一个具体的统计,如图0-3所示。
图0-3 Android设备屏幕尺寸的市场占有率
由此可见,在目前市面中主要是以分辨率为800像素×480像素和960像素×800像素的手机用户居多。另外,作为另一种主流移动设备的平板电脑来说,它不仅拥有更大的屏幕尺寸,而且在浏览方式上也有所不同。例如,大部分平板电脑(以及一些智能手机)都能够以横向或纵向模式进行浏览。这样即使在同一款设备中,屏幕的宽度有时为1024像素,有时则为800像素或更少。但是一般来说,平板电脑为用户提供了更大的屏幕空间,我们可以认为在大部分平板电脑设备的屏幕尺寸为最主流的(1024~1280像素)×(600~800像素)。事实证明,在平板电脑中可以很轻松地以标准格式浏览大部分网站,这是因为其浏览器使用起来就像在计算机显示器上使用一样简单,并且通过Android系统中的缩放功能可以放大难以阅读的微小区域。
本节视频教学录像:2分钟
本书讲解了Android应用开发的基本知识,这是一个漫长的学习过程,需要读者总体规划合理的学习路线,这样能够达到事半功倍的效果。学习Android应用开发的基本路线图如图0-4所示。
图0-4 Android学习路线图
(1)第1步:掌握基础知识
这部分是在学习Android开发技术之前的最基础性知识。包括Android介绍,下载并获取Android,搭建Android开发环境和开发基础必备等内容。
(2)第2步:掌握核心技术
这部分是Android技术的最核心语法知识,也是最基本的知识。包括UI界面布局、核心组件介绍、事件处理、Activity界面表现、Intent和IntentFilter、Service和Broadcast Receiver、应用资源管理机制等内容。
(3)第3步:掌握典型应用
这部分需要实战掌握开发Android典型应用的方法。包括数据存储、图形图像处理、开发音频应用程序、开发视频应用程序、网络数据处理和GPS地图定位等内容。
(4)第4步:掌握知识进阶
这部分是提高Android技术的知识,使读者的水平提升到一个新的高度。包括传感器技术、蓝牙传输技术、Google Now、Android Wear和为Android开发网页等内容。
(5)第5步:综合实战演练
这部分对前面所学的内容进行综合演练,通过综合实例的实现过程,对前面所有的知识达到融会贯通的效果。
本书后面的内容就是按照上述学习路线图进行内容安排的。
第1章 搭建Android应用开发环境
第2章 Android应用开发基础
本章视频教学录像:23分钟
工欲善其事,必先利其器。要想高效地完成一件事,合适的工具必不可少。对于安卓开发人员来说,开发工具同样至关重要。作为一项新兴技术,在进行开发前首先要搭建一个对应的开发环境。而在搭建开发环境前,需要了解安装开发工具所需要的硬件和软件配置条件。本章将详细讲解Android应用开发环境的基本知识和搭建过程。
本章要点(已掌握的在方框中打钩)
□ 安装Android应用环境的系统要求
□ 获取并安装JDK
□ 获取并安装Eclipse和Android SDK
□ Android虚拟设备
□ 综合演练——新手入门的第一个Android应用程序
本节视频教学录像:2分钟
在搭建Android应用开发环境之前,一定要先确定基于Android应用软件所需要开发环境的要求,具体如表1-1所示。
表1-1 开发系统所需求参数
项目 |
版本最低要求 |
说 明 |
备 注 |
---|---|---|---|
操作系统 |
Windows XP 或 Vista Mac OS X 10.4.8+Linux Ubuntu Drapper |
根据自己的计算机自行选择 |
选择自己最熟悉的操作系统 |
软件开发包 |
Android SDK |
建议选择最新版本的SDK |
本书使用的是最主流版本Android 5.0 |
IDE |
Eclipse IDE+ADT |
Eclipse 3.3 (Europa), 3.4 (Ganymede)ADT(Android Development Tools)开发插件 |
选择“for Java Developer” |
其他 |
JDK Apache Ant |
Java SE Development Kit 5 或 6Linux 和Mac上使用Apache Ant 1.6.5+, Windows上使用1.7+版本 |
不能只单独下载JRE,必须下载JDK |
Android工具是由多个开发包组成的,具体说明如下。
JDK:可以到网址 http://www.oracle.com/technetwork/java/javase/downloads/index.html处下载。
Eclipse(Europa):可以到网址 http://www.eclipse.org/downloads/ 下载 Eclipse IDE for Java Developers。
Android SDK:可以到网址 http://developer.android.com 下载。
对应的开发插件。
本节视频教学录像:4分钟
JDK(Java Development Kit)是整个Java的核心,包括了Java运行环境、Java工具和Java基础的类库。JDK是学好Java的第一步,是开发和运行Java环境的基础,当用户要对Java程序进行编译的时候,必须先获得对应操作系统的JDK,否则将无法编译Java程序。
在安装JDK之前需要先获得JDK,获得JDK的操作流程如下所示。
(1)登录Oracle官方网站,网址为http://www.oracle.com/,如图1-1所示。
图1-1 Oracle官方下载页面
(2)在图1-1中可以看到有很多版本,在此本书选择当前和Android兼容性最好的版本Java 7,下载页面如图1-2所示。
图1-2 JDK下载页面
(3)在图1-2中单击JDK下方的【Download】按钮,在弹出的新界面中选择将要下载的JDK,笔者在此选择的是Windows X86版本。如果是64位的Windows系统,则下载Windows X64版本,如图1-3所示。
图1-3 选择Windows X86版本
(1)下载完成后双击下载的“.exe”格式文件开始进行安装,将弹出“安装向导”对话框,在此单击【下一步】按钮,如图1-4所示。
(2)弹出“安装路径”对话框,在此单击【更改】按钮可以自定义设置安装路径。在此设置安装路径是“C:\Program Files\Java\jdk1.7.0_01\”,如图1-5所示。
图1-4 “许可证协议”对话框
图1-5 “安装路径”对话框
(3)单击【下一步】按钮弹出安装进度条,开始在安装路径解压缩下载的文件,如图1-6所示。
(4)完成后弹出“目标文件夹”对话框,在此选择要安装的位置,如图1-7所示。
图1-6 解压缩下载的文件
图1-7 “目标文件夹”对话框
(5)单击【下一步】按钮后开始正式安装,如图1-8所示。
(6)完成后弹出“完成”对话框,单击【完成】按钮后完成整个安装过程,如图1-9所示。
图1-8 正式安装
图1-9 完成安装
完成安装后可以检测是否安装成功,检测方法是依次单击【开始】【运行】,在运行框中输入“cmd”并按下Enter键,在打开的CMD窗口中输入“java –version”,如果显示图1-10所示的提示信息,则说明安装成功。
图1-10 CMD窗口
提示
如何解决安装未成功的问题?
如果检测没有安装成功,需要将其目录的绝对路径添加到系统的PATH中。具体做法如下所示。
(1)右键依次单击【我的电脑】【属性】
【高级】,单击下面的“环境变量”,在下面的“系统变量”处选择新建,在变量名处输入 “JAVA_HOME”,变量值中输入刚才的目录,例如设置为 “C:\Program Files\Java\jdk1.7.0_01”,如图1-11所示。
(2)再次新建一个变量名为classpath的变量,其变量值如下所示。
.;%JAVA_HOME%/lib/rt.jar;%JAVA_HOME%/lib/tools.jar
单击【确定】按钮,找到PATH的变量,双击或单击编辑,在变量值最前面添加如下值。
%JAVA_HOME%/bin;
具体如图1-12所示。
图1-11 设置系统变量
图1-12 设置系统变量
(3)再依次单击【开始】【运行】,在运行框中输入“cmd”并按下Enter键,在打开的CMD窗口中输入“java –version”,如果显示图1-13所示的提示信息,则说明安装成功。
图1-13 CMD界面
注意
上述变量设置中,是按照笔者本人的安装路径设置的,笔者安装的JDK的路径是C:\ProgramFiles\Java\jdk1.7.0_01。
本节视频教学录像:13分钟
在安装好JDK后,接下来需要安装Eclipse和Android SDK。Eclipse是进行Android应用开发的集成工具,而Android SDK是开发Android应用程序所必须具备的框架。在Android官方公布的最新版本中,已经将Eclipse和Android SDK这两个工具进行了集成,一次下载即可同时获得这两个工具。
获取并安装Eclipse和Android SDK的具体步骤如下所示。
(1)登录Android的官方网站http://developer.android.com/index.html,如图1-14所示。
图1-14 Android的官方网站
(2)然后来到http://developer.android.com/sdk/index.html#Other,如图1-15所示。在此页面中可以根据自己机器的操作系统选择下载SDK的版本,例如笔者机器是64位的Windows系统,所以单击“installer_r24.4.1-windows.exe”链接。
图1-15 单击“Get the SDK”链接
(3)在弹出的“Get the Android SDK”界面中勾选“I have read and agree with the above terms and conditions”前面的复选框,如图1-16所示。
图1-16 “Get the Android SDK”界面
(4)单击图1-16中的按钮后开始下载工作。下载完成后将会获得一个可执行的“EXE”文件,双击后可以自动根据你的系统位数(32/64)下载获取Android SDK安装包。
将下载得到的压缩包进行解压,解压后的目录结构如图1-17所示。
图1-17 解压后的目录结构
由此可见,Android官方已经将Eclipse和Android SDK实现了集成。双击“eclipse”目录中的“eclipse.exe”可以打开Eclipse,界面效果如图1-18所示。
图1-18 打开Eclipse后的界面效果
打开Android SDK的方法有两种,第一种是双击下载目录中的“SDK Manager.exe”文件,第二种是在Eclipse工具栏中单击图标。打开后的效果如图1-19所示。
图1-19 打开Android SDK后的界面效果
在上述打开Android SDK后的界面中可知,当前最新的Android SDK版本是6.0。
Android为Eclipse 定制了一个专用插件Android Development Tools(ADT),此插件为用户提供了一个强大的开发Android应用程序的综合环境。ADT扩展了Eclipse的功能,可以让用户快速地建立Android项目,创建应用程序界面。要安装Android Development Tools plug-in,需要首先打开 Eclipse IDE,然后进行如下操作。
(1)打开Eclipse后,依次单击菜单栏中的【Help】【Install New Software...】选项,如图1-20所示。
图1-20 添加插件
(2)在弹出的对话框中单击【Add】按钮,如图1-21所示。
图1-21 添加插件
(3)在弹出的“Add Site”对话框中分别输入名字和地址,名字可以自己命名,例如“123”,但是在“Location”中必须输入插件的网络地址“http://dl-ssl.google.com/Android/eclipse/”,如图1-22所示。
图1-22 设置地址
(4)单击【OK】按钮,此时在“Install”界面将会显示系统中可用的插件,如图1-23所示。
图1-23 插件列表
(5)选中“Android DDMS”和“Android Development Tools”,然后单击【Next】按钮来到安装界面,如图1-24所示。
图1-24 插件安装界面
(6)选择“I accept”选项,单击【Finish】按钮,开始进行安装,如图1-25所示。
图1-25 开始安装
注意
在开始安装步骤中可能会发生计算插件占用资源情况,整个过程会有一点慢。进度完成后会提示用户重启Eclipse来加载插件,等重启后就可以用了。并且不同版本的Eclipse安装插件的方法和步骤是不同的,但是都大同小异,读者可以根据操作提示自行解决。
当完成上述插件装备工作后,此时还不能使用Eclipse创建Android项目,我们还需要在Eclipse中设置Android SDK的主目录。
(1)打开Eclipse,在菜单中依次单击【Windows】【Preferences】项,如图1-26所示。
图1-26 Preferences项
(2)在弹出的界面左侧可以看到“Android”项,选中Android后,在右侧设定 Android SDK 所在目录为 SDK Location,单击【OK】按钮完成设置,如图1-27所示。
图1-27 Preferences项
经过前面步骤的讲解,一个基本的Android开发环境算是搭建完成了。都说实践是检验真理的唯一标准,下面通过新建一个项目来验证当前的环境是否可以正常工作。
(1)打开Eclipse,在菜单中依次选择【File】【New】
【Project】项,在弹出的对话框上可以看到Android类型的选项,如图1-28所示。
图1-28 新建项目
(2)在图1-28上选择“Android”,单击【Next】按钮后打开“New Android Project”对话框,在对应的文本框中输入必要的信息,如图1-29所示。
(3)单击【Finish】按钮后Eclipse会自动完成项目的创建工作,最后会看到图1-30所示的项目结构。
图1-29 “New Android Application”对话框
图1-30 项目结构
本节视频教学录像:1分钟
我们都知道程序开发需要调试,只有经过调试之后才能知道我们的程序是否正确运行。作为一款手机系统,我们怎么样能在计算机平台之上调试Android程序呢?不用担心,谷歌为我们提供了模拟器来解决我们担心的问题。所谓模拟器,就是指在计算机上模拟安卓系统,可以用这个模拟器来调试并运行开发的Android程序。开发人员不需要一个真实的Android手机,只通过计算机即可模拟运行一个手机,即可开发出应用在手机上面的程序。
模拟器全称为Android虚拟设备(Android Virtual Device,AVD),每个AVD模拟了一套虚拟设备来运行Android平台,这个平台至少要有自己的内核,系统图像和数据分区,还可以有自己的的SD卡和用户数据以及外观显示等。
创建AVD的基本步骤如下所示。
(1)单击Eclipse菜单中的图标,如图1-31所示。
图1-31 Eclipse
(2)在弹出的“Android SDK and AVD Manager”界面的左侧导航中选择“Virtual Device”选项,如图1-32所示。
图1-32 “Android SDK and AVD Manager”界面
在“Virtual Device”列表中列出了当前已经安装的AVD版本,我们可以通过右侧的按钮来创建、删除或修改AVD。主要按钮的具体说明如下所示。
:创建一个新的AVD,单击此按钮在弹出的界面中可以创建一个新AVD,如图1-33所示。
:修改已经存在的AVD。
:删除已经存在的AVD。
:启动一个AVD模拟器。
图1-33 新建AVD界面
在创建一个新的AVD时,建议读者在“CPU/ABI”选项中选择“Intel Atom(X86)”或“Intel Atom(X86_64)”。“Intel Atom(X86)”是英特尔公司为计算机用户运行AVD模拟器而开发的,通过这个功能,在安装Intel处理器的计算机中可以让Android模拟器运行得健步如飞。
注意
我们可以在CMD中创建或删除AVD,例如可以按照如下CMD命令创建一个AVD。
android create avd --name <your_avd_name> --target <targetID>
其中“your_avd_name”是需要创建的AVD的名字,CMD窗口界面如图1-34所示。
图1-34 CMD界面
对于Android程序的开发者来说,模拟器的推出给开发者在开发上和测试上带来了很大的便利。无论在Windows下还是Linux下,Android模拟器都可以顺利运行。并且官方提供了Eclipse插件,可以将模拟器集成到Eclipse的IDE环境。Android SDK中包含的模拟器的功能非常齐全,电话本、通话等功能都可正常使用(当然你没办法真的从这里打电话)。甚至其内置的浏览器和Maps都可以联网。用户可以使用键盘输入,鼠标点击模拟器按键输入,甚至还可以使用鼠标点击、拖动屏幕进行操纵。Android 5.0模拟器在计算机上的运行效果如图1-35所示。
在调试的时候我们需要启动AVD模拟器,启动AVD模拟器的基本流程如下所示。
(1)选择图1-34列表中名为“first”的AVD,单击按钮后弹出“Launch Option”界面,如图1-36所示。
(2)单击【Launch】按钮后将会运行名为“first”的模拟器,运行界面效果如图1-37所示。
图1-35 模拟器
图1-36 “Launch”对话框
图1-37 模拟运行界面
本节视频教学录像:3分钟
本实例的功能是在手机屏幕中显示问候语“你好我的朋友!”,在具体开始之前先做一个简单的流程规划,如图1-38所示。
图1-38 规划流程图
【范例1-1】在手机屏幕中显示问候语(配套源码\1\first)
接下来的内容将详细讲解本实例的具体实现流程。
(1)打开Eclipse,依次单击【File】【New】
【Project】新建一个工程,如图1-39所示。
(2)选择“Android Project”选项,单击【Next】按钮。
(3)在弹出的“New Android Project”对话框中,设置工程信息,如图1-40所示。
图1-39 新建工程文件
图1-40 设置工程
在图1-40所示的界面中依次设置工程名字、包名字、Activity名字和应用名字。
现在已经创建了一个名为“first”的工程文件,打开文件first.java,会显示自动生成的如下代码。
01 package first.a;
02 import android.app.Activity;
03 import android.os.Bundle;
04 public class fistMM extends Activity {
05 /** Called when the activity is first created. */
06 @Override
07 public void onCreate(Bundle savedInstanceState) {
08 super.onCreate(savedInstanceState);
09 setContentView(R.layout.main);
10 }
11 }
如果此时运行程序,将不会显示任何东西。此时我们可以对上述代码进行稍微的修改,让程序输出“HelloWorld”。具体代码如下所示。
01 package first.a;
02 import android.app.Activity;
03 import android.os.Bundle;
04 import android.widget.TextView;
05
06 public class fistMM extends Activity {
07 /** Called when the activity is first created. */
08 @Override
09 public void onCreate(Bundle savedInstanceState) {
10 super.onCreate(savedInstanceState);
11 setContentView(R.layout.main);
12 TextView tv = new TextView(this);
13 tv.setText(“你好我的朋友!”);
14 setContentView(tv);
15 }
16 }
经过上述代码改写后,就可以在屏幕中输出“你好我的朋友!”了,完全符合预期的要求。
Android调试一般分为3个步骤,分别是设置断点、Debug调试和断点调试。
(1)设置断点
此处的设置断点和Java中的方法一样,可以通过双击代码左边的区域进行断点设置,如图1-41所示。
图1-41 设置断点
为了调试方便,可以设置显示代码的行数。只需在代码左侧的空白部分单击鼠标右键,在弹出命令中选择“Show Line Numbers”,如图1-42所示。
图1-42 显示行数
(2)Debug调试
Debug Android调试项目的方法和普通Debug Java调试项目的方法类似,唯一的不同是在选择调试项目时选择“Android Application”命令。具体方法是右键单击项目名,在弹出命令中依次选择【Debug As】【Android Application】命令,如图1-43所示。
图1-43 Debug项目
(3)断点调试
可以进行单步调试,具体调试方法和调试普通Java程序的方法类似,调试界面如图1-44所示。
图1-44 调试界面
将上述代码保存后就可运行这段程序了,具体过程如下所示。
(1)右键单击项目名,在弹出命令中依次选择【Run As】【Android Application】,如图1-45所示。
图1-45 开始调试
(2)此时工程开始运行,运行完成后在屏幕中输出“你好我的朋友!”,如图1-46所示。
图1-46 运行结果
通过Eclipse可以导入打开一个已经存在的Android项目。在本书光盘中保存了本书中所有实例的项目文件,接下来以刚创建的“first”为例,介绍导入一个既有项目的具体流程。
(1)打开Eclipse,依次单击【File】【Import】命令,如图1-47所示。
图1-47 【Import】命令
(2)在弹出的“Import”界面中选择“General”选项下面的“Existing Projects into Workspace”子选项,然后单击【Next】按钮,如图1-48所示。
图1-48 选择 “Existing Projects into Workspace”子选项
(3)在弹出的“Import Project”界面中单击【Browse】按钮,在弹出界面中选择要打开工程文件的目录,例如我们要打开的“first”项目,最后单击【Finish】按钮,如图1-49所示。
图1-49 导入光盘中的“first”项目
此时便成功地导入了前面刚创建的“first”项目。
Android开发包括底层开发和应用开发,底层开发大多数是指和硬件相关的开发,并且是基于Linux环境的,例如开发驱动程序。应用开发是指开发能在Android系统上运行的程序,例如游戏和地图等程序。因为读者开发Android应用程序使用的最主流的操作系统是Windows,所以本书只介绍在Windows下配置Eclipse+ADT的过程。
完成安装后可以检测是否安装成功,方法是依次单击【开始】【运行】,在运行框中输入"cmd"并按下Enter键,在打开的CMD窗口中输入“java –version”,如果显示图1-50所示的提示信息,则说明安装成功。
图1-50 CMD窗口
当然Android模拟器不能完全替代真机,具体来说有如下差异:
模拟器不支持呼叫和接听实际来电;但可以通过控制台模拟电话呼叫(呼入和呼出);
模拟器不支持USB连接;
模拟器不支持相机/视频捕捉;
模拟器不支持音频输入(捕捉),但支持输出(重放);
模拟器不支持扩展耳机;
模拟器不能确定连接状态;
模拟器不能确定电池电量水平和交流充电状态;
模拟器不能确定SD卡的插入/弹出;
模拟器不支持蓝牙。
1.请尝试在Linux环境下搭建Android平台,并在Linux环境下运行模拟器。
2.请尝试在苹果Mac环境下搭建Android平台,并在Mac环境下运行模拟器。
本章视频教学录像:21分钟
在正式进行Android应用程序的编码工作之前,需要先了解Android生态系统的整体框架结构,掌握Android应用开发的核心组件的基本知识,并了解Android应用程序文件的基本结构。本章将详细讲解Android系统的体系结构,为读者步入本书后面高级知识的学习打下基础。
本章要点(已掌握的在方框中打钩)
□ Android系统架构
□ Android应用程序文件组成
□ Android的五大组件
本节视频教学录像:9分钟
Android系统是一个移动设备的开发平台,其软件层次结构包括操作系统(OS)、中间件(Middleware)和应用程序(Application)。本节将详细讲解Android系统架构的基本知识。
根据Android的软件框图,其软件层次结构自下而上分为以下4层。
(1)操作系统层(OS)
(2)各种库(Library)和Android 运行环境(Runtime)
(3)应用程序框架(Application Framework)
(4)应用程序(Application)
上述各个层的具体结构如图2-1所示。
图2-1 Android操作系统的组件结构图
本节将详细讲解Android系统各个层次的基本知识。
Android系统的底层内核基于Linux操作系统,本层使用C和C++语言编写实现。其实Android系统就是Linux系统,只是Android系统充分利用了已有的机制,尽量使用标准化的内容,例如驱动程序,并且做出必要的扩展。 Android充分灵活地使用了内核到用户空间的接口,这主要表现在字符设备节点、Sys文件系统、Proc文件系统和不增加系统调用。
Android生态系统的架构十分清晰,自下而上经典的模型分别为Linux驱动、Android硬件抽象层、Android本地框架、Android的Java框架、Android的Java应用程序。因为Android系统需要运行于不同的硬件平台上,所以需要具有很好的可移植性。其中Android系统的硬件抽象层负责建立Android系统和硬件设备之间的联系。
对于标准化比较高的子系统来说,Android系统使用完全标准Linux驱动,例如输入设备(Input-Event)、电池信息(Power Supply)、无线局域网(Wi-Fi协议和驱动)、蓝牙(Bluetooth协议和驱动)。
对于Android系统的硬件抽象层来说,主要实现了与移动设备相关的驱动程序,主要包含了如下所示的驱动系统。
显示驱动(Display Driver):常用基于Linux的帧缓冲(Frame Buffer)驱动;
Flash内存驱动(Flash Memory Driver):是基于MTD的Flash驱动程序;
照相机驱动(Camera Driver):常用基于Linux的V4L(Video for Linux)驱动;
音频驱动(Audio Driver):常用基于ALSA(Advanced Linux Sound Architecture,高级Linux声音体系)驱动;
Wi-Fi驱动(Camera Driver):基于IEEE 802.11标准的驱动程序;
键盘驱动(Keyboard Driver):作为输入设备的键盘驱动;
蓝牙驱动(Bluetooth Driver):基于IEEE 802.15.1标准的无线传输技术;
Binder IPC驱动:Andoid的一个特殊的驱动程序,具有单独的设备节点,提供进程间通信的功能;
Power Management(能源管理):管理电池电量等信息。
可以将Android系统的中间层次分为两个部分,一部分是各种库,另一部分是Android运行环境。Android系统的中间层次的内容大多是使用C和C++实现的,其中包含如下所示的各种库。
C库:C语言的标准库,也是系统中一个最为底层的库,C库是通过Linux的系统调用来实现的;
多媒体框架(Media Frameword):这部分内容是Android多媒体的核心部分,基于Packet Video(即PV)的OpenCore,从功能上本库一共分为两大部分,一部分是音频、视频的回放(Play Back),另一部分则是音视频的记录(Recorder);
SGL:2D图像引擎;
SSL:即Secure Socket Layer,位于TCP/IP协议与各种应用层协议之间,为数据通信提供安全支持;
OpenGL ES:提供了对3D图形图像的支持;
界面管理工具(Surface Management):提供了管理显示子系统等功能;
SQLite:一个通用的嵌入式数据库;
WebKit:网络浏览器的核心;
FreeType:位图和矢量字体的功能。
在Android系统中,各种库一般以系统中间件的形式提供,它们均有的一个显著特点:与移动设备的平台的应用密切相关。
在以前的版本中,Android运行环境主要是指Android虚拟机技术:Dalvik。Dalvik虚拟机与Java虚拟机(Java VM)不同,它执行的不是Java标准的字节码(Bytecode ),而是Dalvik可执行格式(.dex)中执行文件。在执行的过程中,每一个应用程序即一个进程(Linux的一个Process)。二者最大的区别在于Java VM是基于栈的虚拟机(Stack-based),而Dalvik是基于寄存器的虚拟机(Register-based)。显然,后者最大的好处在于可以根据硬件实现更大的优化,这更适合移动设备的特点。
Android的应用程序框架(Application Framework)为应用程序层的开发者提供API,它实际上是一个应用程序的框架。由于上层的应用程序是以Java构建的,因此本层次提供的首先包含了UI(User Interface,用户界面)程序中所需要的各种控件,例如Views(视图组件),其中又包括了List(列表)、Grid(栅格)、Text Box(文本框)、Button(按钮)等,甚至一个嵌入式的Web浏览器。
作为一个基本的Andoid应用程序,可以利用应用程序框架中的以下5个部分来构建。
Activity(活动)
Broadcast Intent Receiver(广播意图接收者)
Service(服务)
Content Provider(内容提供者)
Intent and IntentFilter(意图和意图过滤器)
Android的应用程序主要是用户界面方面的,通过浏览Android系统的开源代码可知,应用层是通过Java语言编码实现的,其中还包含了各种资源文件(放置在res目录中)。Java程序和相关资源在经过编译后,会生成一个APK包。Android本身提供了主屏幕(Home)、联系人(Contact)、电话(Phone)、浏览器(Browers)等众多的核心应用。同时应用程序的开发者还可以使用应用程序框架层的API实现自己的程序,这也是Android开源的巨大潜力的体现。
本节视频教学录像:8分钟
Android应用程序文件的目录结构是大同小异的,本节将详细讲解Android应用程序文件的具体组成,为读者步入本书后面知识的学习打下基础。
本节将以本书第1章1.5节中的实例为素材,介绍Android应用程序文件的具体组成。打开Eclipse,使用“import”命令导入第1章1.5节中的工程“First”,一个基本的Android应用项目的目录结构如图2-2所示。
图2-2 Android应用程序文件组成
接下来将详细分析各个Android应用程序组成文件的具体说明信息。
在“src目录”里面保存了开发人员编写的程序文件。和一般的Java项目一样,“src”目录下保存的是项目的所有包及源文件(.java),“res”目录下包含了项目中的所有资源。例如,程序图标(drawable)、布局文件(layout)和常量(values)等。不同的是,在Java项目中没有“gen”目录,也没有每个Android项目都必须有的AndroidManifest.xml文件。
“R.java”格式文件是在建立项目时自动生成的,这个文件是只读模式,不能更改。R.java文件是定义该项目所有资源的索引文件。例如下面是某项目中R.java文件的代码。
01 package com.yarin.Android.HelloAndroid;
02 public final class R {
03 public static final class attr {
04 }
05 public static final class drawable {
06 public static final int icon=0x7f020000;
07 }
08 public static final class layout {
09 public static final int main=0x7f030000;
10 }
11 public static final class string {
12 public static final int app_name=0x7f040001;
13 public static final int hello=0x7f040000;
14 }
15 }
在上述代码中定义了很多常量,并且这些常量的名字都与res文件夹中的文件名相同,这再次证明R.java文件中所存储的是该项目所有资源的索引。有了这个文件,在程序中使用资源将变得更加方便,可以很快地找到要使用的资源,由于这个文件不能被手动编辑,所以当我们在项目中加入了新的资源时,只需要刷新一下该项目,“R.java”文件便自动生成了所有资源的索引。
文件AndroidManifest.xml是一个控制文件,里面包含了该项目中所使用的Activity、Service和Receiver。例如下面是某项目中文件AndroidManifest.xml的代码。
01 <?xml version=“1.0” encoding=“utf-8”?>
02 <manifest xmlns:android=“http://schemas.android.com/apk/res/android”
03 package=“com.yarin.Android.HelloAndroid”
04 android:versionCode=“1”
05 android:versionName=“1.0”>
06 <application android:icon=“@drawable/icon”
07 android: label=“@string/app_name”>
08 <activity android:name=“.HelloAndroid”
09 android:label=“@string/app_name”>
10 <intent-filter>
11 <action android:name=“android.intent.action.MAIN” />
12 <category android:name=“android.intent.category.LAUNCHER” />
13 </intent-filter>
14 </activity>
15 </application>
16 <uses-sdk android:minSdkVersion=“9” />
17 </manifest>
在上述代码中,intent-filter描述了Activity启动的位置和时间。每当一个Activity(或者操作系统)要执行一个操作时,它将创建出一个Intent的对象,这个Intent对象可以描述你想做什么,你想处理什么数据、数据的类型,以及一些其他信息。Android会和每个Application所暴露的intent-filter的数据进行比较,找到最合适Activity来处理调用者所指定的数据和操作。下面我们来仔细分析AndroidManifest.xml文件,如表2-1所示。
表2-1 AndroidManifest.xml分析
参数 |
说明 |
---|---|
manifest |
根节点,描述了package中所有的内容 |
xmlns:android |
包含命名空间的声明。xmlns:android=http://schemas.android.com/apk/res/android,使得Android中各种标准属性能在文件中使用,提供了大部分元素中的数据 |
package |
声明应用程序包 |
application |
包含package中application级别组件声明的根节点。此元素也可包含application的一些全局和默认的属性,如标签、icon、主题、必要的权限,等等。一个manifest能包含零个或一个此元素(不能大余一个) |
android:icon |
应用程序图标 |
android:label |
应用程序名字 |
activity |
activity是与用户交互的主要工具,是用户打开一个应用程序的初始页面,大部分被使用到的其他页面也由不同的activity所实现,并声明在另外的activity标记中。注意,每一个activity必须有一个<activity>标记对应,无论它给外部使用或是只用于自己的package中。如果一个activity没有对应的标记,将不能运行它。另外,为了支持运行时查找activity,可包含一个或多个<intent-filter>元素来描述activity所支持的操作 |
android:name |
应用程序默认启动的activity |
intent-filter |
声明了指定的一组组件支持的Intent值,从而形成了IntentFilter。除了能在此元素下指定不同类型的值,属性也能放在这里来描述一个操作所需的唯一的标签、icon和其他信息 |
action |
组件支持的Intent Action |
category |
组件支持的Intent Category。这里指定了应用程序默认启动的activity |
uses-sdk |
该应用程序所使用的SDK版本相关 |
在项目“first”的工程文件中,“gen”目录中有两个自动生成的文件,分别是R.java和BuildConfig。在创建Android工程的过程中,Eclipse在生成文件R.java时需要遵循如下所示的两条规则。
(1)每类资源对应R类的一个内部类,所有的字符串资源对应于string内部类,所有的标识资源对应于id内部类。
(2)每个具体的资源项对应于内部类的一个public static final int 类型的Field。
例如项目“first”中文件R.java的具体源码如下所示。
01 package first.a;
02
03 public final class R {
04 public static final class attr {
05 }
06 public static final class drawable {
07 public static final int icon=0x7f020000;
08 }
09 public static final class layout {
10 public static final int main=0x7f030000;
11 }
12 public static final class string {
13 public static final int app_name=0x7f040001;
14 public static final int hello=0x7f040000;
15 }
16 }
在文件R.java中默认有attr、drawable、layout、string等4个静态内部类,每个静态内部类分别对应着一种资源,如layout静态内部类对应layout中的界面文件,其中每个静态内部类中的静态常量分别定义一条资源标识符,例如如下代码表示对应的是“layout”目录下的main.xml文件。
01 public static final int main=0x7f030000;
Android会根据你放入“res”目录的资源,自动更新R.java文件。R.java文件在应用程序中起到字典的作用,它包含了各种资源的地址(ID),通过R.java文件,应用程序可以方便地找到相应的资源元素。
而文件BuildConfig.java比较简单,主要用于实现代码的辅助检查功能,能够在整个Android工程中不断进行自动检测。
在“res”目录中存放了应用永续使用到的各种资源,如XML界面文件、图片、数据等。“res”目录通常包含如下所示的3个子目录。
(1)“drawable”子目录
以drawable开头的4个目录,其中在“drawable-hdpi”目录中存放高分辨率的图片,例如WVGA 400×800 FWVGA 480×854;在“drawable-mdpi”目录中存放的是中等分辨率的图片,例如HVGA 320×480;在“drawable-ldpi”目录中存放的是低分辨率的图片,例如QVGA 240×320。
(2)“layout”子目录
“layout”子目录专门用于存放XML界面布局文件,XML文件同HTML文件一样,主要用于显示用户操作界面。Android应用项目的布局(layout)文件一般通过“res\layout\main.xml”文件实现,通过其代码能够生成一个显示界面。例如“first”项目的布局文件“res\layout\main.xml”的实现源码如下所示。
01 <?xml version=“1.0” encoding=“utf-8”?>
02 <LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
03 android:orientation=“vertical”
04 android:layout_width=“fill_parent”
05 android:layout_height=“fill_parent”
06 >
07 <TextView
08 android:layout_width=“fill_parent”
09 android:layout_height=“wrap_content”
10 android:text=“@string/hello”
11 />
12 </LinearLayout>
在上述代码中,有以下几个布局和参数。
<LinearLayout></LinearLayout>:在这个标签中,所有元件都是按由上到下的排队排成的。
android:orientation:表示当前工程的方式是从上到下垂直地排列其内部的视图。
android:layout_width:定义当前视图在屏幕上所占的宽度,fill_parent即填充整个屏幕。
android:layout_height:定义当前视图在屏幕上所占的高度,fill_parent即填充整个屏幕。
wrap_content:随着文字栏位的不同而改变这个视图的宽度或高度。
在上述布局代码中,使用了一个TextView来配置文本标签Widget(构件),其中设置的属性android:layout_width为整个屏幕的宽度,android:layout_height可以根据文字来改变高度,而android:text则设置了TextView要显示的文字内容,这里引用了@string中的hello字符串,即String.xml文件中的hello所代表的字符串资源。hello字符串的内容“Hello World,HelloAndroid!”这就是我们在“first”项目运行时看到的字符串。
注意
上面介绍的文件只是主要文件,在项目中需要我们自行编写。在项目中还有很多其他的文件,那些文件很少需要我们编写,所以在此就不进行讲解了。
(3)“values”子目录
“values”子目录专门用于存放Android应用程序中用到的各种类型的数据,不同类型的数据存放在不同的文件中,例如文件string.xml会定义字符串和数值,文件arrays.xml会定义数组。例如“first”项目的字符串文件string.xml的实现源码如下所示。
01 <?xml version=“1.0” encoding=“utf-8”?>
02 <resources>
03 <string name=“hello”>Hello World, HelloAndroid!</string>
04 <string name=“app_name”>HelloAndroid</string>
05 </resources>
在类string中使用的每个静态常量名与<string>元素中name属性值相同。上述常量定义文件的代码非常简单,只定义了两个字符串资源,请不要小看上面的几行代码。它们的内容很“露脸”,里面的字符直接显示在手机屏幕中,就像动态网站中的HTML一样。
在“assets”资源目录中,一般用于存放HTML文件、数据库文件和JavaScript文件。因为“assets”目录下的文件不会在R.java中自动生成ID,所以在读取“assets”目录下的文件时必须指定文件的具体路径。
技巧
“gen”目录中的两个文件是Android应用项目自动生成的,有时读者在网络中获取的工程源码没有“gen”目录中的文件,此时无需担心,只需要将源码导入到Eclipse工程中即可,导入后会自动生成对应的“gen”目录文件。
本节视频教学录像:4分钟
一个典型的Android应用程序通常由五个组件组成,这五个组件构成了Android的核心功能。本节将一一讲解这五大组件的基本知识,为读者步入本书后面知识的学习打下基础。
在Android应用程序中,Activity组件通常的表现形式是一个单独的界面(Screen)。每个Aactivity都是一个单独的类,它扩展实现了Activity基础类。这个类显示为一个由Views组成的用户界面,并响应事件。大多数程序有多个Activity。例如,一个文本信息程序有这么几个界面:显示联系人列表界面、写信息界面、查看信息界面或者设置界面等。每个界面都是一个Activity。切换到另一个界面就是载入一个新的Activity。某些情况下,一个Activity可能会给前一个Activity返回值——例如,一个让用户选择相片的Activity会把选择到的相片返回给其调用者。
打开一个新界面后,前一个界面就被暂停,并放入历史栈中(界面切换历史栈)。使用者可以回溯前面已经打开的存放在历史栈中的界面。也可以从历史栈中删除没有界面价值的界面。Android在历史栈中保留程序运行产生的所有界面:从第一个界面,到最后一个。
Android通过一个专门的Intent类来进行界面的切换。Intent(意为意图,目的,意向)描述了程序想做什么。Intent类还有一个相关类IntentFilter。Intent请求来做什么事情,IntentFilter则描述了一个Activity(或下文的Intent Receiver)能处理什么意图。显示某人联系信息的Activity使用了一个IntentFilter,就是说它知道如何处理应用到此人数据的View操作。Activity在文件AndroidManifest.xml中使用IntentFilter。
通过解析Intent可以实现Activity的切换,我们可以使用startActivity(myIntent)启用新的Activity。系统会考察所有安装程序的IntentFilter,然后找到与myIntent匹配最好的IntentFilter所对应的Activity。这个新Activity能够接收Intent传来的消息,并因此被启用。解析Intent的过程发生在startActivity被实时调用时,这样做有如下两个好处。
(1)Activity仅发出一个Intent请求,便能重用其他组件的功能。
(2)Activity可以随时被替换为有等价IntentFilter的新Activity。
Service是一个没有UI且长驻系统的代码,最常见的例子是媒体播放器从播放列表中播放歌曲。在媒体播放器程序中,可能有一个或多个Activity让用户选择播放的歌曲。然而在后台播放歌曲时无需Activity干涉,因为用户希望在播放音乐的同时能够切换到其他界面。既然这样,媒体播放器Activity需要通过Context.startService()启动一个Service,这个Service在后台运行以保持继续播放音乐。在媒体播放器被关闭之前,系统会保持音乐后台播放Service的正常运行。可以用Context.bindService()方法连接到一个Service上(如果Service未运行的话,连接后还会启动它),连接后就可以通过一个Service提供的接口与Service进行通话。对音乐Service来说,提供了暂停和重放等功能。
当要执行一些与外部事件相关的代码时,例如来电响铃时或者半夜时就可能用到Intent Receiver。尽管Intent Receiver使用NotificationManager来通知用户一些好玩的事情发生,但是没有UI。Intent Receiver可以在文件AndroidManifest.xml中声明,也可以使用Context.registerReceiver()来声明。当一个Intent Receiver被触发时,如果需要系统自然会自动启动程序。程序也可以通过Context.broadcastIntent()来发送自己的Intent广播给其他程序。
应用程序把数据存放在一个SQLite数据库格式文件里,或者存放在其他有效设备里。如果想让其他程序能够使用我们程序中的数据,此时Content Provider就很有用了。Content Provider是一个实现了一系列标准方法的类,这个类使得其他程序能存储、读取某种Content Provider可处理的数据。
ART 机制和Dalvik 机制的区别。
从Android 4.4开始,默认的运行环境是ART。ART 的机制与 Dalvik 不同。在Dalvik机制下,应用每次运行的时候,字节码都需要通过即时编译器转换为机器码,这会拖慢应用的运行效率,而在ART 环境中,应用在第一次安装的时候,字节码就会预先编译成机器码,使其成为真正的本地应用。这个过程叫作预编译(Ahead-Of-Time,AOT)。这样的话,应用的启动(首次)和执行都会变得更加快速。
要求使用include语句调用3个字界面page1.xml、page2.xml和page3.xml,在布局文件page1.xml中实现一个精美的登录框效果,如图2-3所示。
图2-3 登录框效果
众所周知,传统的开发语言都能实现树形节点效果。在Windows系统中的资源管理器中,硬盘文件的浏览就是一个典型的树形样式,如图2-4所示。
要求开发一个Android应用程序,执行后的效果如图2-5所示。
图2-4 Windows系统的树形样式
图2-5 执行效果