Android编程实战学习手册(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-03 16:28:22

点击下载

作者:唐城教育

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Android编程实战学习手册

Android编程实战学习手册试读:

前言

当我们团队的老师们萌生写书的念头,一切显得那么自然,四本书一气呵成,涵盖技术类、营销类、专业英语类,本书是其中之一。十年磨一剑,今年是唐城的第十个年头,在这个时候出版,既是献礼,也是十年技术、教学经验扎扎实实的沉淀。我们深知,教育是一种理念、一份责任!我们秉承“让无业者有业,让有业者乐业”的职业教育理念,用专业、职业、敬业的施教精神,帮助超8000名学员成功跨入IT行业、网络营销行业的大门!

因教学经验的积累,我们更知道如何让读者通过阅读,从“不会”到“学会”,从“学会”到“精通”。深入浅出、循序渐进地带领读者走进安卓开发,揭开安卓神秘的面纱,经典的案例,详细的讲解,汇聚了我们多年的教学研讨与企业调研,我们形成了一套成熟的课程体系,完善的组织架构。

移动互联网已经成为当今世界发展最快、市场潜力最大、前景最诱人的业务,而Android则是移动互联网上市场占有率最高的平台,也搭载着 Android 系统的设备层出不穷。与此同时,Android应用选择了Java作为其开发语言,这对于Java程序员来说是一个极好的机会。

本书特色

本书主要由4名资深安卓老师编写,精雕细琢,一切从读者角度出发,案例设置合理紧凑,知识点讲解细致到位。从如何搭建环境开始,到后期NDK开发,从前端的UI设计,到后台的服务器端建设,面面俱到、以点盖面,提升读者的研发能力,拓展产品思路。由于各位老师长期处于授课第一线,更了解学员学习过程中可能遇到的困难,了解如何通过生活中的案例能使学员快速掌握重点难点内容。以教育为出发点,以学员学会为目标,以实用技能为核心,把这个整体的教育理念灌输于本书。减轻了读者的学习压力,提升了学习效率,通过丰富的项目案例提升读者的个人成就感。本书内容由基础知识到实际开发,结构清晰、语言简洁,非常合适Android初学者和Android进阶程序开发者阅读参考。

关于读者

本书适合具有一定Java编程基础的读者学习,如果读者已熟练掌握Java编程语法,并具有一定的界面编程经验,将更适合阅读本书。否则,阅读本书之前,建议学习一些 Java编程的基础知识,相关内容可以访问www.tangcco.com。

同类书比较

本书案例简单易懂,知识架构清晰,由浅入深,由前端到后台,整体诠释了安卓 app开发的每个要点,所有案例均采用图文混编的形式,并附有通过测试的所有关键代码。总结开发过程中的经验,使读者达到举一反三的效果。真正意义上地实现从零基础快速入门,开始Android开发之路,指引新手入门捷径。

感谢

特别感谢鲍健婷、钟华两位校长对本书编写的大力支持,以及对本书内容的指导。

感谢霍炜、唐碧、孙沛林三位老师的整理与撰写,他们兢兢业业、精益求精,将自己最宝贵的知识积累呈现给读者。

感谢聂众老师在编写本书过程中,提供 Java与 Android 之间的差异化及如何实现在两者间过渡编程的思想。唐城教育第1章Java OOP基础串讲

欢迎进入唐城Android的课程学习,在之前的学习中,已经学习了Java的知识,经过一段时间后可能会有些淡忘,那么,在进入正式的Android学习前,先来简单复习一下Java。通过本章内容的学习,应该着重掌握以下内容。(1)类和对象。(2)封装。(3)继承。(4)多态。(5)抽象类及接口。(6)集合框架及泛型。1.1 对象

Java是面向对象的编程语言,首先,就来回忆一下什么是对象。

对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件(万物皆对象)。

对象的状态(属性)和行为(方法)如下:(1)对象具有状态(属性)。使用一组数据值来描述对象的状态(属性)。状态是关于个体的具体事实。比如你的名字,就是你的具体事实。简单做法就是通过名词找属性。(2)对象具有行为(方法)。用以实现某个功能或修改对象状态的操作就是对象的行为(方法)。简单做法就是通过动词找行为(方法)。(3)对象实现了数据和操作的结合,用以更准确地描述对象。(4)通过对象的状态(属性)能够简单地区分不同的对象。比如,你的身份证号和其他人的身份证号不同,用以区分你和其他人。1.2 类

具有相同特性(数据元素)和行为(功能)的对象的抽象就是类。因此,对象的抽象是类,类实际上就是一种数据类型。(1)类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。(2)类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。

从对象中抽取类就是从一系列相似的对象中抽取出它们的共通点。比如,人类。要抽取出人类,那么就必须找到所有隶属于人类的对象的共有特征。如姓名、年龄、身高、体重等。这些都是人类所拥有的共同特征,都是使用名词进行的描述,那么,这些特征就可以定义为类的属性。还可以抽取出一些动作。如吃、跑、跳、说等,这些都是动词也就是类的方法。那么,如何确切地定义有用的属性和方法呢?简单地说,就是抽取出对你的程序运行有帮助的属性和方法,而那些没有帮助的属性和方法,就可以忽略掉。

为了便于回忆,我们先定义一个简单的类。

class student{

int stuNo;

String stuName;

int stuAge;

int stuGender;

void show(){

System.out.print("我叫" + stuName + ",今年" + stuAge + "岁了。")

}

}

其中,stuNo、stuName、stuAge、stuGender 为类的属性,show()方法为类的操作。通过赋予类的属性以不同的属性值,可以区分不同的对象。而 show()方法则是所有隶属此类对象的共通方法。1.3 类和对象的关系

在面向对象的编程中,会频繁地定义类和使用对象。那么在程序中,类和对象的关系就非常重要,理清类和对象的关系,有助于在实际编程中快速地定义类和使用对象协作。那么,类和对象之间到底是什么样的关系呢?

以前的学习中,了解到类和对象的关系就是抽象和具体的关系。简单来说,就是包含的关系。类包含对象,对象属于类。类能够代表对象,而对象无法代表类。1.4 封装

什么是封装?封装就是在程序上,隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。

封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是通过外部接口,以特定的访问权限来使用类的成员。

封装在原则上要求把尽可能多的东西藏起来,对外提供简捷的接口。

class student{

private int stuNo;

public int getStuNo(){

return stuNo;

}

public int setStuNo(int StuNo){

this.stuNo = StuNo;

}

}

以上就是一个最简单的封装,能够看到将属性使用private修饰,外部类无法直接访问属性。增加了两个方法,get()和 set(),用来使外部类能够通过方法访问内部属性,那么,get()和 set()就是属性stuNo对外的接口。1.5 继承

继承一词来自于生活,指按照法律或遵照遗嘱接受死者的财产、职务、头衔、地位等。

程序中的继承是软件技术当中的一个概念。如果一个类A继承自另一个类B,就把这个A称为B的子类,而把B称为“A的父类”。继承可以使得子类具有父类的各种属性和方法,而不需要再次编写相同的代码。在令子类继承父类的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类的原有属性和方法,使其获得与父类不同的功能。另外,为子类追加新的属性和方法也是常见的做法。

Java继承是使用已存在类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。

Java不支持多继承,单继承使Java的继承关系很简单,一个类只能有一个父类,易于管理程序,同时一个类可以实现多个接口,从而克服单继承的缺点。

继承避免了对一般类和特殊类之间共同特征进行的重复描述。同时,通过继承可以清晰地表达每一项共同特征所适应的概念范围——在一般类中定义的属性和操作,适应于这个类本身以及它以下的每一层特殊类的全部对象。运用继承原则使得系统模型比较简练也比较清晰。1.6 多态

多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同实现方式即为多态。引用Charlie Calverts对多态的描述,即多态性是允许你将父对象设置成为和一个或更多的它的子对象相等的技术,赋值之后,父对象就可以根据当前赋值,给它的子对象的特性以不同的方式运作。如果一个语言只支持类而不支持多态,只能说明它是基于对象的,而不是面向对象的。

从程序设计的角度而言,多态可以如下来实现。

public interface Parent {

public void show();

}

public class Child_ONE implements Parent {

public void show(){

//子类1的具体实现

}

}

public class Child_TWO implements Parent {

public void show(){

//子类2的具体实现

}

}

public class Test {

Public static void main(String[] args){

//以父类对象名称指向子类对象实例的方式调用子类1的方法

Parent p1 = new Child_ONE();

p1.show();

//以父类对象名称指向子类对象实例的方式调用子类2的方法

Parent p2 = new Child_TWO();

P2.show();

}

}

p1.show()调用子类1的方法,p2.show()调用子类2的方法。

所以,对于抽象的父类或者接口给出了具体的实现后,p1和p2可以完全不管实现的细节,而只访问定义的方法,就可以。事实上,这就是多态所起的作用,可以实现控制反转,这在大量的J2EE轻量级框架中被用到,比如,Spring的依赖注射机制。1.7 抽象类

关键字 abstract 声明的方法称之为抽象方法。抽象方法是一个不完整的方法,只包含方法的声明,不包含方法的具体实现。

如果一个类中至少包含一个或一个以上的抽象方法,则这个方法所在的类必须声明为:抽象类。

抽象类以及抽象方法的示例如下。

//抽象类

public abstract class Human {

//抽象方法

public abstract void eat();

}

但是,即使不包括任何 abstract 方法,亦可将一个类声明成抽象类。如果一个类没必要拥有任何抽象方法,而且又想禁止那个类的所有实例,这种能力就会显得非常有用。

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。比如,如果进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念,所以,用以表征抽象概念的抽象类是不能够实例化的。

现在来说说抽象类在继承中的体现。

如果从一个抽象类继承,而且想生成新类型的一个对象,就必须为基础抽象类中的所有抽象方法提供方法具体实现。如果不这样做,则衍生类也会是抽象的,而且编译器会强迫用abstract关键字标志那个类的抽象本质。

综上所述,在面向对象领域,抽象类主要用来进行类型隐藏。可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现,表现为所有可能的派生类。模块可以操作一个抽象体,由于模块依赖于一个固定的抽象体,因此,它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。1.8 接口

接口实现和类继承的规则不同,为了数据的安全,继承时一个类只有一个直接父类,也就是单继承,但是一个类可以实现多个接口,接口弥补了类不能多继承的缺点,继承和接口的双重设计既保持了类的数据安全,也变相实现了多继承。

Java接口本身没有任何实现,因为Java接口不涉及表象,而只描述public行为,所以Java接口比Java抽象类更抽象化。但是接口不是类,不能使用new 运算符实例化一个接口。

//接口

public interface Parent{

}

public class Test {

public static void main(String[] args){

Parent p = new Parent();//这是错误的!!

}

}

public class Test1 {

public static void main(String[] args){

Parent p;//这是正确的

}

}

Java接口的方法只能是抽象的和公开的,Java接口不能有构造器,Java接口可以有public、静态的和final属性。即接口中的属性可以定义为 public static final int value = 3。

接口把方法的特征和方法的实现分割开来。这种分割体现在接口常常代表一个角色,它包装与该角色相关的操作和属性,而实现这个接口的类便是扮演这个角色的演员。一个角色由不同的演员来演,而不同的演员之间除了扮演一个共同的角色外,并不要求其他的共同之处。1.9 集合框架

集合框架是为表示和操作集合而规定的一种统一标准的体系结构。任何集合框架都包含三大块内容:对外的接口、接口的实现和对集合运算的算法。

Java2的集合框架,就其核心,主要有三类:List、Set和Map。List和Set继承了Collection,而Map则独成一体。初看上去,可能会对Map独成一体感到不解,它为什么不继承Collection呢?但是仔细想想,这种设计是合理的。一个Map提供了通过Key对Map中存储的Value进行访问,也就是说,它操作的都是成对的对象元素,比如put()和get()方法,而这是一个Set和List所不具备的。当然在需要时,可以由keySet()方法或values()方法从一个Map中得到键的Set集或值的Collection集

1.Collection接口提供了一组操作成批对象的方法

它提供了基本操作,如添加、删除。它也支持查询操作,如是否为空isEmpty()方法等。为了支持对Collection进行独立操作,Java的集合框架给出了一个Iterator,它可以泛型操作一个Collection,而不需知道这个Collection的具体实现类型是什么。

2.List接口对Collection进行了简单的扩充

它常用的具体实现类有ArrayList和LinkedList。可以将任何东西放到一个List容器中,并在需要时从中取出。从ArrayList命名中可以看出,它以一种类似数组的形式进行存储,因此,它的随机访问速度极快,而 LinkedList 的内部实现是链表,它适合用于在链表中间需要频繁进行插入和删除操作。在具体应用时,可以根据需要自由选择。List 最重要的特征就是有序;它能确保以一定顺序保存元素。List在Collection基础上添加了大量方法,使之能在序列中间插入和删除元素(只对LinkedList推荐使用)。List可以制造ListIterator对象,除能用它在List中间插入和删除元素外,还能用它沿两个方法遍历List。

ArrayList:一个用数组实现的 List。能进行快速的随机访问,但是往列表中间插入和删除元素时比较慢。ListIterator只能用在反向遍历ArrayList的场合,不能用它插入和删除元素,因为相比LinkedList,在ArrayList里用ListIterator的系统开销比较高。

LinkedList:对顺序访问进行了优化。在List中间插入和删除元素的代价也不高,随机访问的速度相对较慢。此外,它还有 addFirst()、addLast()、getFirst()、getLast()、removeFirst()和removeLast()等方法,能把它当成栈(stack)、队列(queue)、双向队列(deque)来用。

3.Map是一种把键对象和值对象进行关联的容器

一个值对象又可以是一个Map,因此,这样就可形成一个多级映射。对于键对象来说,像Set一样,一个Map 容器中的键对象不允许重复,这是为了保持查找结果的一致性;如果有两个键对象一样,想得到那个键对象所对应的值对象时就有问题,可能得到的并不是想要的那个值对象,结果会造成混乱,所以键的唯一性很重要,也符合集合的性质。当然,在使用过程中,某个键所对应的值对象可能会发生变化,这时会按照最后一次修改的值对象与键对应。对于值对象没有唯一性的要求,可以将任意多个键都映射到一个值对象上,这不会发生任何问题(不过对使用可能会造成不便,不知道得到的到底是那一个键所对应的值对象)。Map有两种比较常用的实现方法:HashMap和TreeMap。HashMap也用到了哈希码的算法,以便快速查找一个键,TreeMap 则是对键按序存放,因此,它有一些扩展的方法,比如 firstKey()、lastKey()等,还可以从TreeMap中指定一个范围以取得其子Map。键和值的关联很简单,用put(Object key,Object value)方法即可将一个键与一个值对象相关联。用get(Object key)可得到与此key对象所对应的值对象。

HashMap:基于hash表的实现(用它来代替Hashtable)。提供时间恒定的插入与查询,在构造函数中可以设置hash表的capacity和load factor,可以通过构造函数来调节其性能。

TreeMap:基于红黑树数据结构的实现。当查看键或 pair 时,会发现它们是按顺序(根据Comparable或Comparator,全面介绍)排列的。TreeMap的特点,所得到的是一个有序的Map。TreeMap是Map中唯一有subMap()方法的实现。这个方法能获取这个树中的一部分。

综上所述:

①Collection持有单个元素,而Map持有相关联的pair。

②和数组一样,List也把数字下标与对象联系起来,可以把数组和List想象成有序的容器,List会随元素的增加自动调整容量。

③如果要做很多随机访问,那么用ArrayList,但是,如果要在List的中间做很多插入和删除的话,就应该用LinkedList。

④LinkedList能提供队列、双向队列和栈的功能。

⑤Map提供的不是对象与数组的关联,而是对象和对象的关联。

⑥HashMap看重的是访问速度,而TreeMap看重键的顺序,因而TreeMap不如HashMap快。

⑦没必要在新代码里再使用旧类库留下来的Vector、Hashtable和Stack。1.10 泛型

泛型(Generic type 或generics)是对Java语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作使用参数化类型时指定类型的一个占位符,就像方法的形式参数是运行时传递值的占位符一样,Java泛型是JDK1.5的新特性。

示例如下:

//不使用泛型

List list = new ArrayList();

list.put(new Integer(3));

Integer I =(Integer)list(0);

//使用泛型

List<Integer> list = new ArrayList<Integer>();

list.put(new Integer(3));

Integer I = list(0);

在Java语言中,引入泛型的一个重要目标,就是维护向后兼容。尽管JDK 5.0的标准类库中的许多类,比如集合框架,都已经泛型化,但是,使用集合类(比如 HashMap 和 ArrayList)的现有代码,将继续不加修改地在JDK 5.0中工作。当然,没有利用泛型的现有代码,将不会赢得泛型的类型安全好处。

这里,需要注意一个问题。关于泛型的混淆,List<Object> 不是 List<String> 的父类型。他们之间没有继承关系,即使String继承了Object。

下面的代码是非法的:

//使用泛型

List<String> list = new ArrayList<String>();

List<Object> olist = list;

这样设计的原因,在于根据olist的声明,编译器允许向olist中添加任意对象(例如Integer),但是,此对象是List<String>,破坏了数据类型的完整性

泛型同样可以用于方法和类,即泛型方法和泛型类。

1.泛型方法

在引入泛型之前,类中的方法要支持多个数据类型,就需要对方法进行重载,在引入泛型后,可以解决此问题(多态),进一步可以定义多个参数以及返回值之间的关系。

例如:

//重载方法

public void write(Integer i,Integer[] array);

public void write(Double i,Double[] array);

//泛型方法

public <T> void write(<T> I,<T>[] array);

类型参数的命名风格如下。

推荐用简练的名字作为形式类型参数的名字(如果可能,用单个字符)。最好避免小写字母,这能使它和其他普通的形式参数很容易区分。使用T代表类型,无论何时都没有比这更具体的类型区分,这经常见于泛型方法。如果有多个类型参数,可能使用字母表中的临近的字母 T,比如 S。如果一个泛型函数在一个泛型类里出现,最好避免在方法的类型参数和类的类型参数中使用同样的名字,避免混淆。对内部类也是一样。

2.泛型类

定义带类型参数的类时,在紧跟类名之后的<>内,指定一个或多个类型参数的名字,同时也可以对类型参数的取值范围进行限定,多个类型参数之间用逗号(,)分隔。定义了类型参数后,可以在定义位置之后的类的几乎任意地方(静态块、静态属性、静态方法除外),使用类型参数,就像使用普通的类型一样。

public class Test<T> {

//类内部代码

}

注意,父类定义的类型参数不能被子类继承。

通配符。通配符即是对类型参数赋予不确定值。

例如:

//通配符定义泛型集合

List<?> unkownList;

注意,在Java集合框架中,对于参数值是未知类型的容器类,只能读取其中元素,不能向其中添加元素,因为,其类型未知,所以编译器无法识别添加元素的类型和容器的类型是否兼容,唯一的例外是NULL。

List<String> list;

List<?> unkownList;

List<?> unknowList1 = list;

unkownList = unknowList1;

List = unkownList; //编译错误

Java语言中引入泛型是一个较大的增强功能。不仅语言、类型系统和编译器有较大变化,以支持泛型,而且类库也进行了大的修改,所以许多重要的类,比如集合框架,都已经泛型化。这带来了以下好处。

①类型安全。

泛型的主要目标是提高Java程序的类型安全。知道使用泛型定义的变量的类型限制,编译器可以在高程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中(还可能存在于代码注释中)。

Java程序中的一种流行技术是定义这样的集合,即它的元素或键是公共类型的,比如“String列表”或“String 到 String 的映射”。通过在变量声明中捕获这一附加的类型信息,泛型允许编译器实施这些附加的类型约束。类型错误就可以在编译时被捕获,而不是在运行时当作ClassCastException 展示出来。将类型检查从运行时段提前到编译时段,有助于更快找到错误,并可提高程序的可靠性。

②消除强制类型转换。

泛型的一个附带好处是,消除源代码中的许多强制类型转换。这提高了代码的可读性,并且减少出错机会。第2章Android布局及控件

前一章回顾了java基础知识,以及学习了Java的高级特性后,本章将进入Android的学习,将针对Android的基础布局及基础控件展开深入学习,读者应该重点掌握以下内容。(1)会使用安卓中常用的五种布局。(2)熟练掌握及使用Android中的控件。2.1 Android简介

2009年1月7日,工业和信息化部正式发放了3G牌照,中国移动、中国电信和中国联通分别获得TD-SCDMA、CDMA2000和WCDMA牌照。随着3G牌照的发放,这一年被业界称为“中国的3G元年”。2.1.1 移动互联网时代

3G到底是什么,为什么无数人对之翘首期盼,无数人对3G的到来欢呼雀跃。3G是第三代数字通信技术的简称。所谓3G,是指将无线通信与国际互联网等多媒体通信结合的新一代移动通信系统。3G 只是一种通信技术标准,符合这个标准的技术有 WCDMA、CDMA2000、TD-SCDMA三种制式。中国联通使用的是WCDMA(世界上大部分3G网络都采用该标准),中国电信使用的是 CDMA2000(日、韩和北美使用),中国移动使用的是具有自主知识产权的TD-SCDMA(只有中国才使用)。相对第一代模拟制式手机(1G)和第二代GSM、CDMA等数字手机(2G),3G网络能处理图像、音乐、视频等多种媒体形式,提供包括网页浏览、电话会议、电子商务等多种信息服务。第三代与前两代的主要区别是在传输声音和数据的速度上有很大提升。作为新一代数字通信技术,3G能为我们带来什么?

60年前计算机的出现和发展,将人类带入了信息时代,20多年前PC的出现,造就了软件领域的微软和硬件领域的英特尔与戴尔,今天我们正快速迈进以“手机+互联网”为代表的移动互联网时代,全世界的程序员都面临着一次巨大的机遇。

纵观当前的移动设备上的操作系统,依然还处于iPhone OS、Windows Mobile、和Android群雄争霸的阶段。与其他的操作系统相比,由Google领衔的开放手机联盟所推出的世界上第一个开源的手机平台——Android,无疑成为了其中的佼佼者。2.1.2 Android的优势

开放手机联盟(Open Handset Alliance)是美国Google 公司于2007 年宣布组建的一个全球性的联盟组织,该组织由大约30家机构组成,致力于向市场推出一个优秀的开放移动系统——Android,移动设备上第一个开放、完善和免费的平台。作为传统互联网领域的霸主,Google早在2002年就进入了移动领域,并试图一统传统互联网和移动互联网。Android的推出,就是实现这一雄心勃勃目标的重要一步。那么,被Google寄予如此厚望的Android到底具有哪些优势呢?

●开源

开源是Android最值得关注的特征之一,源代码完全开放,便于开发人员更清楚地把握实现细节,便于提高开发人员的技术水平,有利于开发出更具差异性的应用。同时开放的平台意味着平台上所有缺失的元素都将被全世界的开发者提供。举例来说,多媒体编解码器可以由第三方程序员提供而不是依赖于Google或其他任何一个机构。

●应用程序平等

Android是一个构建于移动设备之上的软件平台,包括一个基于Linux操作系统的内核、丰富的用户接口、应用程序、代码库、应用程序框架/多媒体支持等重要的组成部分。虽然其底层的操作系统是用C、C++编写的,然而Android上的应用程序却使用Java语言开发。甚至一些内置的应用程序也是用Java编写的。设备上运行的内置程序与用户基于SDK创建的应用程序没有任何区别,这意味着设备上的应用程序甚至一些核心程序是可以被替换或扩展的。甚至手机中的拨号程序都可以由第三方程序员所开发的拨号程序替代,这在其他的任何手机平台上几乎是不可能实现的。

●应用程序间无界限

应用程序可以通过标准API访问核心移动应用,应用程序还可以声明它们的功能可以供其他应用程序使用。此外,Android程序员可以把Web上的数据与本地的联系人、日历和位置信息同步,从而创造全新的用户体验。

●Dalvik虚拟机

出于某些考虑,Google并未在Android平台上使用Java虚拟机,而是开发了自己的虚拟机Dalvik。Dalvik虚拟机在有限内存、电池和CPU等多方面进行了优化,使其更适合在移动终端上使用,大大提高了Android的运行速度。

●良好的产业链支持

历来困扰移动市场的一个很大问题,是市场中不同的角色有着各自不同的利益诉求。移动运营商、硬件厂商、软件厂商相对独立和封闭,大大提高了进入移动互联网市场的门槛。Android的推出和开放手机联盟的组建,使相关各方拥有了一个标准的、开放式的统一平台,因而得到了各方的大力支持。再加上其良好的盈利模式使产业链各方都可以获得不错的利益,将移动终端的评价标准从硬件向软件转变,极大地激发了软件开发者的热情。

如前所述,Android 的优势使得其在移动市场获得了优异的表现,市场占有率节节攀升。Android为平台的手机如雨后春笋不断涌现,以Android为平台的平板电脑也已经面世。业界一致看好 Android 平台在未来的表现,甚至有机构预测未来 Android 的市场占有率将超过百分之五十。那么究竟是什么样的技术和设计支撑着Android如此强势的表现呢?后面将介绍Android的系统架构,以使大家对Android能够有进一步的了解。2.1.3 Android系统架构

从图2-1中可以看到,Android平台由Linux内核、库、Android运行时、应用程序框架和应用程序五部分组成。下面,介绍Android的系统结构。图2-1

●Android内核

Android 依赖Linux 内核2.6 提供核心服务,比如安全、内存管理、进程管理、网络、硬件驱动(包括显示驱动、摄像头驱动、蓝牙驱动、Flash 内存驱动、Binder(IPC)驱动、USB驱动、键盘驱动、WiFi驱动、音频驱动及电源管理)。在这里,Linux内核扮演的是硬件层和系统其他层之间的一个抽象层的角色,以使应用程序开发人员可以忽略硬件层次的一些细节。通常的做法,是硬件厂商在生产硬件设备的同时,应当为在其设备上运行的 Android 系统修改其Linux内核,在Linux内核中写入该硬件设备的驱动(图2-2),而这一细节与该硬件设备上运行的应用程序无关。图2-2

Android平台使用的Linux内核并非类GNU/Linux的内核,因为其系统库、系统初始化和编程接口都和标准的Linux系统有所不同。从Google目前公布的Linux系统来看,该系统没有虚拟内存文件系统,系统所用的是yaffs2文件系统,具体的映像也都位于SDK安装目录下。通过emulator –console命令可以在host中断下得到一个简单的可以控制Android的shell。该系统还包含一个“工具箱”,提供一些基本的命令工具,集中在 /sbin、/system/sbin、/system/bin 目录中,但是很简陋,命令种类也很少。

1.Android运行时

虽然Android使用Java语言来开发应用程序,但却没有采用大家常用的J2ME来执行Java程序,而是采用Android自有的Android运行时来执行。

Android运行时包括核心库和Dalvik虚拟机两个核心。

①核心库提供Java编程语言核心库的大多数功能。

其中最核心的部分见表2-1和如图2-3所示。表2-1图2-3

②Dalvik虚拟机。

如前所述,Android采用针对移动设备优化过的Dalvik虚拟机运行其程序。在Android中,每一个应用程序都有一个自有的进程,Android 并不是使用一个 Dalvik 虚拟机来同时执行多个Android 应用程序,而是为每一个 Android 应用程序都分配一个 Dalvik 虚拟机来执行。Dalvik被设计成一个设备可以同时高效地运行多个虚拟系统。

Dalvik虚拟机有许多地方是参考Java虚拟机的设计,但Dalvik虚拟机所执行的中间代码并非是Java虚拟机所执行的Java字节码,同时也不直接执行Java类(Java Class File),而是依靠转换工具将Java字节码转为dex(Dalvik Executable)可执行文件(扩展名为.dex)。

Dalvik虚拟机与Java 虚拟机最大的不同,在于Java虚拟机是基于栈的(stack-based),而Dalvik 虚拟机是基于寄存器的(register-based)。从技术层面来看,基于寄存器的虚拟机有一个很大的好处,那就是对于目前主流的硬件架构,很容易与现有系统整合,且达到最优化,而所需要的资源也相对较少。最重要的是,Dalvik 虚拟机并不是由 J2ME 实现,从而绕开了 J2ME授权相关的问题。

2.Android系统库

Android 包含一些 C/C++库,这些库能被 Android 系统中不同的组件使用。它们通过Android 应用程序框架为开发者提供服务,以下是一些核心库。

●Surface Manager

对显示子系统的管理,并且为多个应用程序提供2D和3D图层的无缝融合。

●Media Libraries

基于PacketVideo OpenCORE,该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。编码格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG。

●SQLite

SQLite是一套开放源码的关系数据库,一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。

●OpenGL|ES(3D类库)

基于OpenGL ES 1.0 APIs实现,该库可以使用硬件3D加速(如果可用),或者使用高度优化的3D软加速。

●Free Type

位图(bitmap)和矢量(vector)字体显示。

●WebKit/LibWebCore

一个最新的Web浏览器引擎,支持Android浏览器和一个可嵌入的Web视图。

●SGL

底层的2D图形引擎。

●SSL

Secure Socket Layer用于保护网页通信的协议。

●libc(c系统函数库)

一个从BSD继承来的标准C系统函数库,它是专门为基于embedded linux的设备定制的,如图2-4所示。图2-4

3.Android应用程序框架

开发人员也可以完全访问核心应用程序所使用的API框架。该应用程序的架构设计简化了组件的重用,任何一个应用程序都可以发布它的功能块,并且任何其他的应用程序都可以使用其所发布的功能块(不过,必须遵循框架的安全性限制)。同样,该应用程序的重用机制也使用户可以方便地替换程序组件,如图2-5所示。图2-5

隐藏在每个应用后面的是一系列的服务和系统,其中包括如下。

●Activity Manager(Activity管理器)

用来管理应用程序生命周期,并提供常用的导航回退功能。

●Window Manager(窗口管理器)

管理所有的窗口程序。

●Content Providers(内容提供器)

使应用程序可以访问另一个应用程序的数据(如联系人数据库),或者共享它们自己的数据。

●Views System(视图系统)

丰富而又可扩展的视图(Views),可以用来构建应用程序,它包括列表(lists),网格(grids),文本,框(text boxes),按钮(buttons),甚至可嵌入的web浏览器。

●Notification Manager(通知管理器)

使应用程序可以在状态栏中显示自定义的提示信息。通知列设定在手机的顶部,像短信(short Message),Voice mail都会在此进行提示。

●Package Manager(包管理器)

Android系统内的程序管理。

●Telephony Manager(电话管理器)

用来管理所有移动设备的功能。

●Resource Manager(资源管理器)

提供非代码资源的访问,如本地字符串、图形、布局文件(layout files)等。

●Location Manager(位置管理)。

用来提供位置服务

4.Android应用程序

Android应用程序会同一系列核心应用程序包一起发布,该应用程序包包括E-mail客户端,SMS短消息程序、日历、地图、浏览器、联系人管理程序等(图2-6)。所有的应用程序都是使用Java语言编写的。图2-6

至此,简单地介绍了Android的系统架构,可能对于有些读者来说感觉这些架构非常陌生,不要紧,随着我们逐步深入学习Android的开发知识,还能更深入地理解Android的系统架构。那么,就让我们开始Android学习之旅吧。2.1.4 搭建Android开发环境

在开始正式学习之前,先做好前期的一些准备工作,包括准备硬件设备和开发环境等。学习 Android 开发,无需购买特定的终端设备,只需准备一台计算机,并安装好相应的开发环境和模拟器即可。Android对硬件要求不高,当前的主流计算机(不包括上网本)一般均可安装Android开发环境,具体的系统环境要求可以参考http://androidappdocs.appspot.com/ sdk/requirements.html。

Android 的开发环境可以在不同的操作系统上安装,但在下载开发工具时,需注意下载与操作系统对应的软件版本。下面,一步一步地开始搭建开发环境。

1.下载所需软件(1)JDK

开发Android应用程序,以Java为开发语言,所以,需要下载并安装JDK。可以在以下网址下载最新的JDK,http://www.oracle.com/technetwoek/java/javase/ downloads/index.html,下载页面如图2-7所示。图2-7

在图2-7所示页面,单击Download JDK按钮,进入如图2-8所示的页面。

如图2-8所示,在platform选项处选择与计算机对应的操作系统,本书采用Windows操作系统。然后填写其他注册信息,单击Continue 按钮,进入如图2-9所示页面。

在如图2-9所示页面中,单击下载图标或超链接,开始下载。图2-8图2-9(2)Eclipse

Eclipse 是当前比较流行的一款优秀的开源开发工具,通过安装相关插件(ADT),可以使用Eclipse来开发。Eclipse可以http:// www.eclipse.org/download下载,建议下载Eclipse IDE for Java EE Devlopers版本,下载页面如图2-10所示。(3)Android SDK安装包

Android SDK安装包可以在http://androidappdocs.appspot.com/sdk/index.html下载,选择与操作系统对应的链接进行下载,如图2-11所示。图2-10图2-11(4)Android ADT插件

ADT 插件是安装在 Eclipse 上的插件,安装方式有两种,第一种安装方式无需下载此插件,直接在Eclipse中配置插件下载地址即可安装插件,第二种方式是先下载此插件,再配置Eclipse,本书采用第二种方式。ADT插件的下载地址为:http://androidappdocs.appspot.com/sdk/eclipse-adt.html,下载页面如图2-12所示,单击图中的ADT超链接即可下载,当前的最新版本为22.6.3,本书使用ADT10.0.0版本。图2-12

2.安装JDK

下载完成后,可以开始安装开发环境了,首先安装JDK,双击之前下载的JDK安装程序,弹出如图2-13所示窗口。在窗口中单击“接受”按钮,弹出如图2-14所示窗口。图2-13图2-14

单击“更改”按钮,可选择安装路径,可以在C盘下建立一个名为Adroid_dev的文件夹,将所有 Android 开发环境的相关软件都安装在该文件夹内。选择好路径之后,单击“下一步”按钮,开始安装,如图2-15所示。

安装完成后弹出如图2-16所示窗口,单击“完成”按钮即完成了JDK的安装。图2-15图2-16

3.安装Eclipse

Eclipse是一款绿色软件,其安装比较简单,将下载的压缩包直接解压到指定路径即可。

本书的解压路径设置为 C:\Android_dev\。我们下载的 JDK 为英文版本,如需汉化,可到Eclipse官方网站下载汉化包。由于使用软件涉及的英文并不复杂,建议大家使用英文版本,可以避免一些汉化中出现的错误。

4.安装SDK

前面我们下载了Android SDK的安装包,双击该安装包,会自动弹出两个安装窗口,引导我们下载和安装所需的SDK,如图2-17、图2-18所示。

在图2-18所示页面左侧列表框中,选择需要安装的SDK版本,绿色对号为选中,取消选中可直接单击绿色对号或选中相应项目后单击右侧的单选按钮 Reject。选择好后,单击 Install按钮开始下载和安装SDK。安装时间根据网速和选择的版本多少而不同,一般需要比较长的时间,耐心等待即可,安装界面如图2-19所示。图2-17图2-18

提示,一般在开发中,为了保持对以前版本的兼容,需要做兼容性测试。所以安装SDK时可能需要选择多个版本,本书安装了1.5到2.3.1版本的SDK。

5.安装和配置ADT

使用Eclipse开发Android程序,需要先在Eclipse中安装ADT插件。启动Eclipse,选择Eclipse的菜单项Help→Install New Software…,弹出如图2-20所示的Install窗口。

单击图2-20窗口中的Add按钮,弹出Add Repository窗口,如图2-21所示。图2-19图2-20图2-21

如图2-21所示,在Name文本框内输入插件名,然后单击Archive按钮,返回到Install窗口,选中Install窗口中解析出的所有安装包(在选项前的方框中打钩),如图2-22所示。

连续单击Next按钮,进入如图2-23所示窗口,在右下角选择I accept the terms of the license agreements单选按钮,然后单击Finish按钮。图2-22图2-23

安装完成后,弹出Software Updates 对话框,单击Restart Now按钮重启Eclipse,即完成了ADT插件的安装,如图2-24所示。图2-24

6.配置SDK

安装好ADT插件后,开始在Eclipse中配置SDK路径,在Eclipse菜单中选择Window→Preferences...,弹出Preferences窗口,如图2-25所示。

在如图2-26所示的左侧树状菜单中选择Android节点,然后单击Browse按钮,选择Android SDK所在的根目录,然后单击Apply按钮,即可看到所安装的ADK包,如图2-26所示。图2-25图2-26

最后单击OK按钮,完成SDK路径设置。

7.创建AVD(Android模拟器)

模拟器是测试和执行Android应用程序的一个虚拟Android手机环境,要创建AVD,首先在Eclipse中选择菜单Window→Android SDK and AVD Manager,然后在弹出的Android SDK and AVD Manager窗口中单击New按钮,弹出Create new Android virtual Device(AVD)对话框,如图2-27所示。

在图2-27所示对话框中,输入模拟器的相关信息,如下所述。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载