51CTO下载-Android基础知识详解,毕业论文设计,开题报告,外文翻译

3997
    


来源:
Licence:
联系:
分类:
平台:
环境:
大小:
更新:
标签:
联系方式 :
免费下载 ×

下载APP,支持永久资源免费下载

限免产品服务请联系qq:1585269081

下载APP
免费下载 ×

下载APP,支持永久资源免费下载

下载APP 免费下载
下载 ×

下载APP,资源永久免费


如果出现不能下载的情况,请联系站长,联系方式在下方。

免费下载 ×

下载论文助手APP,资源永久免费

免费获取

如果你已经登录仍然出现不能下载的情况,请【点击刷新】本页面或者联系站长


Android基础知识详解

wuliming

wuliming_sc@qq.com

wuliming_sc@hotmail.com

92

2010.08
参考书目
目录

TOC \o "1-2" \z \u HYPERLINK \l "_Toc290755614" 参考书目 290755614 2

HYPERLINK \l "_Toc290755615" 目录 290755615 3

HYPERLINK \l "_Toc290755616" Android的系统架构 290755616 6

HYPERLINK \l "_Toc290755617" 一、应用程序 290755617 6

HYPERLINK \l "_Toc290755618" 二、应用程序框架 290755618 6

HYPERLINK \l "_Toc290755619" 三、Android Runtime 290755619 7

HYPERLINK \l "_Toc290755620" 四、系统库 290755620 7

HYPERLINK \l "_Toc290755621" 五、Linux 内核 290755621 8

HYPERLINK \l "_Toc290755622" Webkit浏览器引擎简介 290755622 9

HYPERLINK \l "_Toc290755623" Dalvik虚拟机简介 290755623 11

HYPERLINK \l "_Toc290755624" 什么是Dalvik虚拟机 290755624 11

HYPERLINK \l "_Toc290755625" Dalvik和Android系统 290755625 11

HYPERLINK \l "_Toc290755626" Dalvik虚拟机的主要特征 290755626 12

HYPERLINK \l "_Toc290755627" Android应用开发和Dalvik虚拟机 290755627 15

HYPERLINK \l "_Toc290755628" Activity生命周期 290755628 16

HYPERLINK \l "_Toc290755629" 一、Activity栈 290755629 16

HYPERLINK \l "_Toc290755630" 二、Activity的4种状态 290755630 16

HYPERLINK \l "_Toc290755631" 三、Activity的生命周期 290755631 17

HYPERLINK \l "_Toc290755632" 四、实例说明 290755632 18

HYPERLINK \l "_Toc290755633" Android控件的继承关系 290755633 22

HYPERLINK \l "_Toc290755634" 一、View与ViewGroup关系 290755634 22

HYPERLINK \l "_Toc290755635" 二、各控件的继承关系 290755635 23

HYPERLINK \l "_Toc290755636" 界面布局 290755636 25

HYPERLINK \l "_Toc290755637" LinearLayout(线性布局) 290755637 25

HYPERLINK \l "_Toc290755638" TableLayout(表格布局) 290755638 28

HYPERLINK \l "_Toc290755639" RelativeLayout(相对布局) 290755639 31

HYPERLINK \l "_Toc290755640" AbsoluteLayout(绝对布局) 290755640 34

HYPERLINK \l "_Toc290755641" FrameLayout(框架布局) 290755641 34

HYPERLINK \l "_Toc290755642" Toast 290755642 36

HYPERLINK \l "_Toc290755643" Notification 290755643 38

HYPERLINK \l "_Toc290755644" 对话框 290755644 42

HYPERLINK \l "_Toc290755645" 一、带三个按钮的对话框 290755645 42

HYPERLINK \l "_Toc290755646" 二、简单列表对话框、单选列表对话框、多选列表对话框 290755646 44

HYPERLINK \l "_Toc290755647" 三、水平进度对话框和圆形进度对话框 290755647 47

HYPERLINK \l "_Toc290755648" 四、自定义对话框 290755648 49

HYPERLINK \l "_Toc290755649" Menu菜单 290755649 52

HYPERLINK \l "_Toc290755650" 选项菜单 290755650 52

HYPERLINK \l "_Toc290755651" 上下文菜单 290755651 53

HYPERLINK \l "_Toc290755652" 三、子菜单 290755652 54

HYPERLINK \l "_Toc290755653" 4种响应菜单项单击事件的方式 290755653 56

HYPERLINK \l "_Toc290755654" 显示和编辑文本的控件 290755654 57

HYPERLINK \l "_Toc290755655" TextView 290755655 57

HYPERLINK \l "_Toc290755656" CheckedTextView 290755656 60

HYPERLINK \l "_Toc290755657" EditText 290755657 60

HYPERLINK \l "_Toc290755658" ExtraEditText 290755658 61

HYPERLINK \l "_Toc290755659" AutoComplteteTextView、MultiAutoCompleteTextView (自动完成输入内容) 290755659 61

HYPERLINK \l "_Toc290755660" Button 290755660 63

HYPERLINK \l "_Toc290755661" ImageButton 290755661 65

HYPERLINK \l "_Toc290755662" ZoomButton 290755662 65

HYPERLINK \l "_Toc290755663" 日期和时间控件 290755663 66

HYPERLINK \l "_Toc290755664" DatePicker、TimePicker 290755664 66

HYPERLINK \l "_Toc290755665" AnalogClock、DigitalClock 290755665 68

HYPERLINK \l "_Toc290755666" 单选框、复选框、开关状态按钮 290755666 69

HYPERLINK \l "_Toc290755667" 单项选择(RadioGroup、RadioButton) 290755667 69

HYPERLINK \l "_Toc290755668" 复选框(CheckBox) 290755668 71

HYPERLINK \l "_Toc290755669" 开关状态按钮(ToggleButton) 290755669 73

HYPERLINK \l "_Toc290755670" 下拉列表框Spinner 290755670 74

HYPERLINK \l "_Toc290755671" ScrollView、HorizontalScrollView 290755671 77

HYPERLINK \l "_Toc290755672" 垂直滚动(ScrollView) 290755672 77

HYPERLINK \l "_Toc290755673" 水平滚动(HorizontalScrollView) 290755673 78

HYPERLINK \l "_Toc290755674" 两个方向均可滚动 290755674 78

HYPERLINK \l "_Toc290755675" TabHost 290755675 79

HYPERLINK \l "_Toc290755676" ProgressBar、SeekBar、RatingBar 290755676 81

HYPERLINK \l "_Toc290755677" 进度条(ProgressBar) 290755677 81

HYPERLINK \l "_Toc290755678" 拖动条(SeekBar) 290755678 83

HYPERLINK \l "_Toc290755679" 评分组件(RatingBar) 290755679 86

HYPERLINK \l "_Toc290755680" GridView、Gallery和ImageSwitcher 290755680 88

HYPERLINK \l "_Toc290755681" GridView 290755681 88

HYPERLINK \l "_Toc290755682" Gallery和ImageSwitcher 290755682 91

HYPERLINK \l "_Toc290755683" ListView 290755683 94

HYPERLINK \l "_Toc290755684" 一、普通的ListView 290755684 94

HYPERLINK \l "_Toc290755685" 可以单选和多选的ListView 290755685 95

HYPERLINK \l "_Toc290755686" 使用SimpleAdapter建立复杂的列表项 290755686 97

HYPERLINK \l "_Toc290755687" 自定义Adapter来建立复杂的列表项 290755687 99

HYPERLINK \l "_Toc290755688" 动态添加、删除ListView列表项 290755688 102

HYPERLINK \l "_Toc290755689" 改变ListView列表项选中状态的背景颜色 290755689 102

HYPERLINK \l "_Toc290755690" 可展开的列表组件 290755690 102

HYPERLINK \l "_Toc290755691" 数据的存取 290755691 103

HYPERLINK \l "_Toc290755692" SharePreferences 6.1 290755692 103

HYPERLINK \l "_Toc290755693" 文件的存储6.2 290755693 103

HYPERLINK \l "_Toc290755694" SQLite数据库6.4 290755694 103

HYPERLINK \l "_Toc290755695" ContentProvider、ContentResolver 6.5 290755695 105

HYPERLINK \l "_Toc290755696" Intent 290755696 106

HYPERLINK \l "_Toc290755697" 用Intent启动Activity,并在Activity之间传递数据 290755697 106

HYPERLINK \l "_Toc290755698" 调用其他应用程序中的Activity(打电话、浏览网页、发Email等) 290755698 109

HYPERLINK \l "_Toc290755699" 接收和发送广播 290755699 113

HYPERLINK \l "_Toc290755700" 接收系统广播 290755700 113

HYPERLINK \l "_Toc290755701" 在自己的应用程序中发送广播 290755701 117

HYPERLINK \l "_Toc290755702" Android服务 290755702 118

HYPERLINK \l "_Toc290755703" 系统服务 8.2 290755703 118

HYPERLINK \l "_Toc290755704" 时间服务 8.3 290755704 118

HYPERLINK \l "_Toc290755705" 跨进程访问 8.4 290755705 118

HYPERLINK \l "_Toc290755706" 网络 290755706 119

HYPERLINK \l "_Toc290755707" 图形、音频、视频 290755707 120

HYPERLINK \l "_Toc290755708" 图形 10.1 290755708 120

HYPERLINK \l "_Toc290755709" 音频、视频 10.2 290755709 120

HYPERLINK \l "_Toc290755710" 2D动画 290755710 121

HYPERLINK \l "_Toc290755711" 帧动画 290755711 121

HYPERLINK \l "_Toc290755712" 补间动画 290755712 121

HYPERLINK \l "_Toc290755713" OpenGL ES编程 290755713 122

HYPERLINK \l "_Toc290755714" Android支持的各种资源 290755714 123

HYPERLINK \l "_Toc290755715" 窗口小部件(App Widget) 290755715 124

HYPERLINK \l "_Toc290755716" NDK编程 290755716 125

Android的系统架构

Android的系统架构和其操作系统一样,采用了分层的架构。从架构图看,android分为四个层,从上层到低层分别是应用程序层、应用程序框架层、Android运行时和库、linux内核:

一、应用程序

Android会同一系列核心应用程序包一起发布,该应用程序包包括电子邮件,短信,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用JAVA语言编写的。当然,你也可以自己用自己编写的应用程序来替换Android提供的应用程序。

二、应用程序框架

应用程序框架是我们进行Android开发的基础,开发人员大部分情况下也是在和应用程序框架层打交道。应用程序框架层包括了活动管理器、窗口管理器、内容提供器、视图系统、包管理器、电话管理器、资源管理器、位置管理器、通知管理器九大部分,如上图所示。各部分的具体功能如下:

活动管理器(Activity Manager):活动管理器用来管理应用程序生命周期并提供常用的导航回退功能

窗口管理器(Window Manager):管理所有的窗口程序

内容提供器(Content Providers):内容提供器使得应用程序可以访问另一个应用程序的数据,或者共享出它自己的数据

视图系统(View System):丰富而又可扩展的各种视图,是构建应用程序的基本组件。 它包括列表,网格,文本框,按钮, 甚至是可嵌入的web浏览器等等

包管理器(Package Manager):Android系统内的程序管理

电话管理器(Telephony Manager):用来管理所有的移动设备的功能

资源管理器(Resource Manager):提供各种资源让应用程序去使用,比如本地化字符串、图片、布局文件、视频文件等等

位置管理器(Location Manager):用来提供位置服务

通知管理器(Notification Manager):使应用程序可以在状态栏中显示警告信息。状态栏通常在手机的顶部,短信、邮件等的提示信息就会出现在这里

在Android平台上,开发人员可以完全访问核心应用程序所使用的API框架。并且,任何一个应用程序都可以发布自身的功能模块,而其他应用程序则可以使用这些已发布的功能模块。基于这样的重用机制,用户就可以方便地替换平台本身的各种应用程序组件。

三、Android Runtime

Android运行时包括核心库和Dalvik虚拟机两部分,这两部分的具体功能如下所示:

核心库:核心库包含两部分内容:一部分为绝大多数java语言所需要调用的功能函数,另一部分为Android的核心库,比如android.os、android.net、android.media等等。与标准java不一样的是,每个Android应用程序都有一个自有的进程,Android不是用一个Dalvik虚拟机来同时执行多个Android应用程序,而是每个Android应用程序都用一个自有的Dalvik虚拟机来执行。

Dalvik虚拟机:Dalvik是一种基于寄存器的java虚拟机,Dalvik虚拟机主要是完成对象生命周期的管理,堆栈的管理,线程管理,安全和异常的管理,以及垃圾回收等等重要功能。基于寄存器的虚拟机的一个优点就是所需要的资源相对较少,用硬件实现虚拟机比较容易一些。Dalvik虚拟机是专门为移动设备设计的,它在开发的时候就考虑到用最少的内存资源来执行,以及支持同时执行多个虚拟机的特性。Dalvik虚拟机所执行的中间码并非是java虚拟机所执行的java字节码,而是依靠转换工具dx将java字节码转换成 .dex 格式由虚拟机执行。Dalvik虚拟机与java虚拟机最大的不同在于java虚拟机基于栈,而Dalvik基于寄存器。

四、系统库

系统库各部分功能如下所示:

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

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

SQLite:一个对于所有应用程序可用,功能强劲的轻量级关系型数据库引擎

OpenGL ES:Android是依据OpenGL ES 1.0 API标准来实现其3D绘图函数库的,该函数库可以用软件方式执行,也可以用硬件加速方式执行,其中3D软件光栅处理方面已进行高度优化

FreeType:提供点阵字、向量字的描绘显示

WebKit:Wekbit是一个开源的Web浏览器引擎。Apple的Safari, Google的Chrome, Nokia S60平台的默认浏览器,Apple手机和Android手机的默认浏览器,都采用的是Webkit作为浏览器的引擎。另外两个浏览器引擎分别是Gecko和Trident,大名鼎鼎的Firefox便是使用的Gecko,而微软的IE系列则使用的是Trident。WebKit引擎比其它引擎更受程序员欢迎的原因,除了其引擎的高效稳定,兼容性好外,其源码结构清晰,易于维护,是一个很重要的原因。近年来,google的加入更是让Webkit有所升温,从 Goole Chrome浏览器, Goole Anroid手机操作系统内置浏览器均采用Webkit作为内核。

SGL: 2D绘图方面的绘图引擎

Libc:一个从 BSD 继承来的标准C系统函数库( libc),它是专门为基于embedded linux的设备定制的

SSL:………………………………
五、Linux 内核

Android 的核心系统服务依赖于 Linux 2.6 内核,如安全性,内存管理,进程管理,网络协议栈和驱动模型。Linux内核也同时作为硬件和软件栈之间的抽象层。Linux内核中包含如下一些驱动:显示驱动、摄像头驱动、flash内存驱动、Binder(IPC)驱动、键盘驱动、Wifi驱动、Audio驱动、电源管理等等

WebKit简介参照其它总结材料

Dalvik虚拟机简介参照其它总结材料Webkit浏览器引擎简介

HYPERLINK "http://www.cnblogs.com/jyli/archive/2010/01/31/1660355.html" http://www.cnblogs.com/jyli/archive/2010/01/31/1660355.html
什么是Webkit

Wekbit是一个开源的Web浏览器引擎。Apple的Safari, Google的Chrome, Nokia S60平台的默认浏览器,Apple手机和Android手机的默认浏览器,都采用的是Webkit作为浏览器的引擎。另外两个浏览器引擎分别是Gecko和Trident,大名鼎鼎的Firefox便是使用的Gecko,而微软的IE系列则使用的是Trident。WebKit引擎比其它引擎更受程序员欢迎的原因,除了其引擎的高效稳定,兼容性好外,其源码结构清晰,易于维护,是一个很重要的原因。近年来,google的加入更是让Webkit有所升温,从 Goole Chrome浏览器, Goole Anroid手机操作系统内置浏览器均采用Webkit作为内核。

Wekbit做了什么?

作为浏览器的内核,Webkit做了哪些工作?为了了解这些,先让我们来看下一个Web浏览器究竟做了什么。我们可以从输入输出的角度来看一个Web浏览器为我们做了哪些工作。先看一个简单的例子,Web浏览器的输入是一个HTML文档,输出则是一个我们用眼睛所看到的一个Web页面, 就普通用户而言它的输入和输出就是这么简单,如下图所示:

INCLUDEPICTURE "http://images.cnblogs.com/cnblogs_com/jyli/webkit/browser_fun.jpg" \* MERGEFORMATINET

那么Webkit的输入和输出又是什么呢?如果能明白这个,那我们就能很清楚的知道Webkit到底是做什么的了。不过现在要说清楚这个还有点困难,因为Webkit的输出就要复杂些了,因为它的输出本来就非直接面向用户,简单点来说,Webkit的输入是web文档,输出是一些看不见的模型,浏览器上层借助于这些模型来绘制出我们所看到的实际页面。

 Webkit组成

Webkit实际上包含三大部分,至少从代码结构上来说是这样的,当然,如果细分的话还能够划分出更多的模块。如下所示

INCLUDEPICTURE "http://images.cnblogs.com/cnblogs_com/jyli/webkit/webkit_overview.jpg" \* MERGEFORMATINET

其中,WebCore是Webkit的核心部分,它实现了对文档的模型化,包括了CSS, DOM, Render等的实现;JavaSript Core显然是对JavaSript支持的实现(WebCore和JSCore来自于KDE项目的KHTML和KJS开源项目)。而橘黄色标注的Webkit部分包含了很多不同平台对Webkit封装的实现,即抽象出了与浏览器所能直接对应的一些概念的实现,比如WebView,WebPage, WebFrame等等。这三部分共同构成了Webkit, 在源码中,它们分别对应三个目录,即Webkit三大部分为WebCore, JavaSript Core,Webkit。

 

更多关于Webkit的介绍,搜索相关的资料…
Dalvik虚拟机简介

HYPERLINK "http://www.ophonesdn.com/article/show/15" http://www.ophonesdn.com/article/show/15
什么是Dalvik虚拟机

Google于2007年底正式发布了Android SDK, 作为 Android系统的重要特性,Dalvik虚拟机也第一次进入了人们的视野。它对内存的高效使用,和在低速CPU上表现出的高性能,确实令人刮目相看。依赖于底层Posix兼容的操作系统,它可以简单的完成进程隔离和线程管理。每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。很多人认为Dalvik虚拟机是一个Java虚拟机,因为Android的编程语言恰恰就是Java语言。但是这种说法并不准确,因为Dalvik虚拟机并不是按照Java虚拟机的规范来实现的,两者并不兼容,同时还有两个明显的不同:

1、Java虚拟机运行的是Java字节码,而Dalvik虚拟机运行的则是其专有的文件格式DEX(Dalvik Executable)。

2、在Java SE程序中的Java类会被编译成一个或者多个字节码文件(.class)然后打包到JAR文件,而后Java虚拟机会从相应的CLASS文件和JAR文件中获取相应的字节码;Android应用虽然也是使用Java语言进行编程,但是在编译成CLASS文件后,还会通过一个工具(dx)将应用所有的CLASS文件转换成一个DEX文件,而后Dalvik虚拟机会从其中读取指令和数据。

Dalvik和Android系统

Android的系统架构和其操作系统一样,采用了分层的架构。从架构图看,android分为四个层,从上层到低层分别是应用程序层、应用程序框架层、Android运行时和库、linux内核:
如图所示,Android RunTime包括两部分:核心库和Dalvik虚拟机。核心库包括了最基本的类库,如data structure, network, Utilities, File system等的,很多实现代码都是来自 HYPERLINK "http://harmony.apache.org/" Apache Harmony项目,主要目的是保证虚拟机的类库能够和Java SE的类库最大可能的兼容,从而降低应用开发者从Java SE阵营转移到Android开发阵营的难度,增加其可用性。Dalvik虚拟机主要是完成对象生命周期的管理,堆栈的管理,线程管理,安全和异常的管理,以及垃圾回收等等重要功能。

Dalvik虚拟机的主要特征

Dalvik虚拟机非常适合在移动终端上使用,相对于在桌面系统和服务器系统运行的虚拟机而言,它不需要很快的CPU速度和大量的内存空间。根据Google的测算,64M的RAM已经能够令系统正常运转了。其中24M被用于底层系统的初始化和启动,另外20M被用于高层启动高层服务。当然,随着系统服务的增多和应用功能的扩展,其所消耗的内存也势必越来越大。归纳起来,Dalvik虚拟机有如下几个主要特征:

一、专有的DEX文件格式

DEX是Dalvik虚拟机专用的文件格式,而为什么弃用已有的字节码文件(CLASS文件)而采用新的格式呢?

1、一个应用中会定义很多类,编译完成后即会有很多相应的CLASS文件,CLASS文件间会有不少冗余的信息;而DEX文件格式会把所有的CLASS文件内容整合到一个文件中。这样,除了减少整体的文件尺寸,I/O操作,也提高了类的查找速度。原来每个类文件中的常量池,在DEX文件中由一个常量池来管理,具体方式如下图:2、增加了新的操作码的支持

3、文件结构尽量简洁,使用等长的指令,借以提高解析速度

4、尽量扩大只读结构的大小,借以提高跨进程的数据共享

如何生成DEX文件呢?Android系统和Dalvik虚拟机提供了工具(DX),在把Java源代码编译成CLASS文件后,使用DX工具。
二、DEX的优化

DEX文件的结构是紧凑的,如果我们还想要求运行时的性能有进一步提高,我们就仍然需要对DEX文件进行进一步优化。优化主要是针对以下几个方面:

1、调整所有字段的字节序(LITTLE_ENDIAN)和对齐结构中的每一个域

2、验证DEX文件中的所有类

3、对一些特定的类进行优化,对方法里的操作码进行优化。

优化后的文件大小会有所增加,应该是原DEX文件的1-4倍。优化发生的时机有两个:对于预置应用,可以在系统编译后,生成优化文件,以ODEX结尾。这样在发布时除APK文件(不包含DEX)以外,还有一个相应的ODEX文件;对于非预置应用,包含在APK文件里的DEX文件会在运行时被优化,优化后的文件将被保存在缓存中。
三、基于寄存器

相对于基于堆栈的虚拟机实现,基于寄存器的虚拟机实现虽然在硬件通用性上要差一些,但是它在代码的执行效率上却更胜一筹。一般来讲,虚拟机中指令的解释执行时间主要花在以下三个方面:

1、分发指令

2、访问运算数

3、执行运算

其中“分发指令”这个环节对性能的影响最大。在基于寄存器的虚拟机里,可以更为有效的减少冗余指令的分发和减少内存的读写访问,如:
虽然Dalvik虚拟机并没有使用目前流行的虚拟机技术,如JIT,但是根据Google的报告,这个功能的缺失并没有让Dalvik虚拟机在性能上有所损失。我们也相信,Dalvik虚拟机的性能还有进一步提高的空间。 
四、一个应用,一个虚拟机,一个进程

每一个Android应用都运行在一个Dalvik虚拟机实例里,而每一个虚拟机实例都是一个独立的进程空间。虚拟机的线程机制,内存分配和管理,Mutex等等都是依赖底层操作系统而实现的。所有Android应用的线程都对应一个Linux线程,虚拟机因而可以更多的依赖操作系统的线程调度和管理机制。

不同的应用在不同的进程空间里运行,加之对不同来源的应用都使用不同的Linux用户来运行,可以最大程度的保护应用的安全和独立运行。

Zygote是一个虚拟机进程,同时也是一个虚拟机实例的孵化器,每当系统要求执行一个Android应用程序,Zygote就会FORK出一个子进程来执行该应用程序。这样做的好处显而易见:Zygote进程是在系统启动时产生的,它会完成虚拟机的初始化,库的加载,预置类库的加载和初始化等等操作,而在系统需要一个新的虚拟机实例时,Zygote通过复制自身,最快速的提供个系统。另外,对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块内存区域,大大节省了内存开销。
      应用程序包(APK)被发布到手机上后,运行前会对其中的DEX文件进行优化,优化后的文件被保存到缓存区域(优化后的格式被称为DEY),虚拟机会直接执行该文件。如果应用包文件不发生变化,DEY文件不会被重新生成。Android应用开发和Dalvik虚拟机

Android应用所使用的编程语言是Java语言,和Java SE一样,编译时使用Sun JDK将Java源程序编程成标准的Java字节码文件(.class文件),而后通过工具软件DX把所有的字节码文件转成DEX文件(classes.dex)。最后使用Android打包工具(aapt)将DEX文件,资源文件以及AndroidManifest.xml文件(二进制格式)组合成一个应用程序包(APK)。应用程序包可以被发布到手机上运行。

Activity生命周期

一、Activity栈

Android系统中,所有Acitivity被保存在Activity栈中。当启动一个新的Activity时,这个Activity就被压入Activity栈的顶部。如果用户通过返回键回到上一个Activity的画面,则栈顶的Activity将被弹出,下一个Activity就变成新的栈顶Activity,并显示在屏幕上。下图显示了Activity栈的运作方式:
二、Activity的4种状态

Activity状态的变化完全由Android的内存管理器决定,变化顺序是不确定的,用户无法预知。Activity从创建到关闭,可能经历下面的4种状态:

1、活跃状态:当一个Activity位于Activity栈的顶部时,它所代表的用户界面位于屏幕的最前端。也就是说,此时Activity代表的界面对用户来说是可见的,同时用户还可以在这个界面上进行操作。Android会尽可能维持处于活跃状态的Activity,采取的措施包括中止位于Activity栈上其他的Activity,以便释放资源。此时如果另一个Activity的状态变为活跃,之前活跃的Activity将变为暂停。

2、暂停状态:有一种特殊情况,Activity对用户来说是可见的,但是它并不拥有用户输入的焦点,如果Activity处于这种状态,我们就称之为暂停的Activity。这种情况发生的场景通常是:在应用程序的前端有一个透明的、或者非全屏显示的Activity,处于暂停状态的Activity的界面位于这个透明的、或者非全屏显示的界面下面。一般情况下,Android也不会结束处于暂停状态的Activity,但是如果资源极其匮乏,系统也有可能结束暂停的Activity。[在程序中模拟这样的情况]

3、结束状态:Activity所显示的界面在屏幕上不可见,那么它的状态就是结束状态。系统会在内存中保存处于结束状态的Activity的状态信息,以便该Activity重新变为可见的时候,状态能够迅速切换。当系统内存不足需要释放内存资源时,处于结束状态的Activity是首选对象。

4、销毁状态:当Activity彻底结束或者关闭后,它的状态就变为非活跃状态,这时Activity已经从Activity栈上移除。
 

三、Activity的生命周期
从上图可以看到,有3个比较关键的生命周期循环:

   1、activity完整的生命周期 自第一次调用 onCreate()开始,直至调用onDestroy()为止。activity在onCreate()中初始化Activity,而在onDestroy()中释放所有系统资源。比如说,如果activity有一个线程在后台运行以从网络上下载数据,它会以 onCreate()创建那个线程,而以 onDestroy()销毁那个线程。

    2. activity的可见生命周期 自onStart() 调用开始直到对应的onStop()调用。当Activity运行到onStart()时,用户可以在屏幕上看到此Activity,当Activity运行到onStop()时,这个Activity就从屏幕上消失。在此期间,Activity对用户来说是可见的,虽然有时候Activity并不拥有对用户的输入焦点。

   3. activity的活跃生命周期 自onResume()调用起,到对应的onPause()调用为止。在此期间,用户不仅能够看到Activity,还能够通过屏幕获得输入的焦点。和可见生命周期类似,在Activity完整的生命周期中可能经历多个活跃生命周期。尽可能保持onPouse()和 onResume()的简洁,这样能够使得应用程序切换的时候响应迅速(需要注意的是,在内存不足的时候,onPause()、onStop()这两种状态是可以被系统直接kill的)

四、实例说明

当activity从一个状态转变到另一个状态时,Activity类中对应于该状态的方法将被调用:

onCreate()

onStart()

onResume()

onPause()

onStop()

onDestroy()

 我们可以重载所有这些方法以便在状态改变时做一些合适的工作。所有的activity都必须实现onCreate()用以当对象第一次实例化时进行初始化设置。很多activity会实现 onPause()以提交数据变化或准备停止与用户的交互。
 具体代码参见附件,这里仅仅列出重要的部分:

AndroidManifest.xml




package="com.studio.android"

android:versionCode="1"

android:versionName="1.0">




android:label="@string/app_name">


















ActivityLifeCycle.java

package com.studio.android;
import android.app.Activity;

import android.app.AlertDialog;

import android.content.DialogInterface;

import android.content.Intent;

import android.content.DialogInterface.OnClickListener;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.widget.Button;
public class ActivityLifeCycle extends Activity {



private static final String TAG = "[LifeCycle]";

private Button btnOpenDialog;

private Button btnOtherActivity;



@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);



initialView();//对控件进行各种初始化操作



Log.i(TAG, "onCreate");

}



@Override

public void onRestart()

{

super.onRestart();

Log.i(TAG, "onRestart");

}



@Override

public void onStart()

{

super.onStart();

Log.i(TAG, "onStart");

}



@Override

public void onResume()

{

super.onResume();

Log.i(TAG, "onResume");

}



@Override

public void onPause()

{

super.onPause();

Log.i(TAG, "onPause");

}



@Override

public void onStop()

{

super.onStop();

Log.i(TAG, "onStop");

}



@Override

public void onDestroy()

{

super.onDestroy();

Log.i(TAG, "onDestroy");

}



private void initialView()

{

btnOpenDialog = (Button)this.findViewById(R.id.btnOpenDialog);

btnOtherActivity = (Button)this.findViewById(R.id.btnOtherActivity);



Button.OnClickListener btnOpenDialogListener = new Button.OnClickListener(){

public void onClick(View v) {

new AlertDialog.Builder(ActivityLifeCycle.this)

.setIcon(android.R.drawable.ic_dialog_info)

.setTitle("欢迎")

.setMessage("欢迎使用本程序,Activity生命周期测试.")

.setPositiveButton("确定", new OnClickListener(){

public void onClick(DialogInterface dialog, int which) {

// TODO Auto-generated method stub

}

}).create().show();

}

};



Button.OnClickListener btnOtherActivityListener = new Button.OnClickListener(){

public void onClick(View v) {

Intent intent = new Intent(ActivityLifeCycle.this,OtherActivity.class);

startActivity(intent);

}

};



btnOpenDialog.setOnClickListener(btnOpenDialogListener);

btnOtherActivity.setOnClickListener(btnOtherActivityListener);

}

}
运行后模拟器的界面如下:

五、根据log信息,详细分析Activity的生命周期

1、启动该程序:

 

Activity的启动顺序是onCreate -> onStart -> onResume
2、启动然后退出该程序:
退出当前Activity时,onPause -> onStop -> onDestory
3、启动改程序,然后点击“open dialog”按钮,打开一个新的按钮:
我们发现打开或者关闭对话框时log信息无任何变化,这说明打开对话框不会影响当前activity的状态变化。
4、预留问题:用非全屏显示的Activity,或者透明的Activity,模拟那种从运行到暂停的状态变化
5、先启动ActivityLifeCycle,然后启动另外一个Activity1,最后返回ActivityLifeCycle:

INCLUDEPICTURE "C:\\DOCUME~1\\reanow\\LOCALS~1\\Temp\\}DB9$2C[($U%E4UK0W)53SR.jpg" \* MERGEFORMATINET

注意,这里所打印出来的log信息,都是ActivityLifeCycle这个Activity里面的,进入另外的Activity1时相关的log信息未成打印出来。
6、启动改程序,然后按Ctrl+F12切换屏幕方向,然后按返回键退出该程序:保存activity状态

protected void onSaveInstanceState (Bundle outState)

protected void onRestoreInstanceState (Bundle savedInstanceState)Android控件的继承关系

一、View与ViewGroup关系

View:View是可视化控件的基类,它主要提供了控件描绘和事件处理的方法。而可视化控件,是指重新实现了View的绘制和事件处理方法并最终与用户交互的对象,如文本显示、按钮等等。

ViewGroup:ViewGroup类也是继承自View类,ViewGroup的作用就是作为View的容器,它负责对添加进ViewGroup的这些View进行管理和布局。一个ViewGroup还可以加入到另外一个ViewGroup里面。布局相关的控件并不直接显示给用户,其主要功能在于控制子控件在屏幕上的摆放位置。

ViewGroup的嵌套关系:ViewGroup的继承关系图:
二、各控件的继承关系三、视图的显示控制

《Android/Ophone开发完全讲义》P34~38

使用XML布局文件控制视图 《Android/Ophone开发完全讲义》4.2.2

在代码中控制视图 《Android/Ophone开发完全讲义》4.2.3界面布局

为了适应各式各样的界面风格,Android系统提供了5种布局,这5种布局分别是:

LinearLayout(线性布局)

TableLayout(表格布局)

RelativeLayout(相对布局)

AbsoluteLayout(绝对布局)

FrameLayout(框架布局)

利用这五种布局,可以在屏幕上将控件随心所欲的摆放,而且控件的大小和位置会随着屏幕大小的变化作出相应的调整。下面是这五个布局在View的继承体系中的关系:
LinearLayout(线性布局)

线性布局是程序中最常见的一种布局方式,线性布局可以分为水平线性布局和垂直线性布局两种,通过android:orientation属性可以设置线性布局的方向。下面是一个简单的线性布局的例子:




android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

>


android:layout_width="fill_parent"

android:layout_height="wrap_content" />


android:orientation="horizontal"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:gravity="right">


android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="确定"/>


android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="取消" />





对应的模拟器上的布局效果以及框架图如下所示:
最外层布局为垂直线性布局,宽度为整个屏幕(fill_parent),高度为刚好适合子控件(wrap_content)。然后依次添加一个EditText,一个水平布局的LinearLayout,在这个线性布局里面,摆放两个Button,该线性布局的gravity属性设置为”right”,所以里面的两个Button靠右显示。

android:gravity

LinearLayout标签有一个非常重要的属性gravity,该属性用于控制布局中控件的对齐方式。如果是没有子控件的控件设置此属性,表示其内容的对齐方式,比如说TextView里面文字的对齐方式;若是有子控件的控件设置此属性,则表示其子控件的对齐方式,比如上面例子里面的两个Button的对齐方式。gravity可以取以下值,如果需要设置多个属性值,需要使用“|”进行组合:
android:gravity与android:layout_gravity的区别:android:gravity定义了这个元素内所有子元素对于这个元素的布局,比如一个TextView内部文字的对齐方式;android:layout_gravity定义了这个元素相对于父元素(比如Layout)的布局,比如一个TextView在整个Layout中的位置。这两个属性对应的常量值都是一样的,如上表所示。

2、android: layout_weight

首先需要注意的是,没有android:weight这样的属性,这个与上面的android:gravity不一样。我们可以通过设置控件的layout_weight属性以控制各个控件在布局中的相对大小。layout_weight属性是一个非负整数值。线性布局会根据该控件layout_weight值与其所处布局中所有控件layout_weight值之和的比值为该控件分配占用的区域。例如,在水平布局的LinearLayout中有两个Button,这两个Button的layout_weight属性值都为1,那么这两个按钮都会被拉伸到整个屏幕宽度的一半。如果layout_weight指为0,控件会按原大小显示,不会被拉伸;对于其余layout_weight属性值大于0的控件,系统将会减去layout_weight属性值为0的控件的宽度或者高度,再用剩余的宽度或高度按相应的比例来分配每一个控件显示的宽度或高度。下例简要说明该属性的用法:




android:orientation="vertical" android:layout_width="fill_parent"

android:layout_height="fill_parent">


android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_weight="1">


android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_weight="1">








android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical" >


android:layout_width="wrap_content"

android:layout_height="wrap_content">








android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical">


android:layout_width="166px"

android:layout_height="98px"

android:orientation="vertical">


android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="RadioButton">




android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="RadioButton">










MyTab.java:

public class MyTab extends TabActivity implements OnTabChangeListener {
private TabHost myTabhost;



@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

myTabhost=this.getTabHost();
LayoutInflater.from(this).inflate(R.layout.main, myTabhost.getTabContentView(), true);

myTabhost.setBackgroundColor(Color.argb(150, 22, 70, 150));



myTabhost.addTab(myTabhost.newTabSpec("One") //make a new Tab

.setIndicator("tab1", getResources().getDrawable(R.drawable.gimp))

.setContent(R.id.widget_layout_Blue));
myTabhost.addTab(myTabhost.newTabSpec("Two") //make a new Tab

.setIndicator("tab2", getResources().getDrawable(R.drawable.mumule))

.setContent(R.id.widget_layout_red));
myTabhost.addTab(myTabhost.newTabSpec("Three") //make a new Tab

.setIndicator("tab3", getResources().getDrawable(R.drawable.notepad))

.setContent(R.id.widget_layout_green));



myTabhost.setOnTabChangedListener(this);

}
@Override

public void onTabChanged(String tagString) {

if (tagString.equals("One")){

}

else if(tagString.equals("Two")){

}

else if(tagString.equals("Three")){

}

else{

}

}

}
模拟器:ProgressBar、SeekBar、RatingBar
进度条(ProgressBar)

ProgressBar默认情况下是圆形的进度条,可以通过style属性将圆形进度条设置成大中小三种形式,代码如下:




android:layout_height="wrap_content"

style="?android:attr/progressBarStyleSmallTitle"/>




android:layout_height="wrap_content"/>




android:layout_height="wrap_content"

style="?android:attr/progressBarStyleLarge"/>

ProgressBar在默认情况下显示的是中型的圆形进度条,因此,如果想要显示的就是中等大小的圆形进度条,无需设置style属性。
ProgressBar还支持水平进度条,代码如下:


android:layout_width="fill_parent" android:layout_height="wrap_content"

style="?android:attr/progressBarStyleHorizontal"

android:max="100"

android:progress="30"

android:secondaryProgress="60"

android:layout_marginTop="20dp" />

进度条的总大小用android:max设置,其值可以是任意一个合法的正整数。ProgressBar的水平进度条支持两级进度,分别使用android:progress和android:secondaryProgress属性设置。本例中,一级进度和二级进度分别显示在进度条总长度的30%和60%的位置上。在代码中设置水平进度条的两级进度需要使用ProgressBar类的setProgress和setSecondaryProgress方法。
Android还支持将水平或者圆形的进度条放在标题栏上。例如,将圆形进度条放在标题栏上,可以在onCreate中使用如下的代码:

requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

setContentView(R.layout.main);

setProgressBarIndeterminateVisibility(true);

如果要将水平进度条放在标题栏上,可以在onCreate方法中使用如下代码:

requestWindowFeature(Window.FEATURE_PROGRESS);

setContentView(R.layout.main);

setProgressBarVisibility(true);

setProgress(1200); //设置水平进度条的当前进度,默认最大值为10000

将进度条放在标题栏,有以下需要注意的事项:

requestWindowFeature方法应该在setContentView之前调用,否则系统会抛出异常

setProgressBarIndeterminateVisibility、setProgressBarVisibility、setProgress要在setContentView之后调用,否则这些方法无效

放在标题栏上的水平进度条不能设置最大值,系统已经将最大值设置为10000

main.xml:




android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent">




android:layout_height="wrap_content"

android:text="圆形进度条(小)" />


android:layout_height="wrap_content"

style="?android:attr/progressBarStyleSmallTitle" />


android:layout_height="wrap_content"

android:text="圆形进度条(中)" />


android:layout_height="wrap_content" />


android:layout_height="wrap_content"

android:text="圆形进度条(大)" />


android:layout_height="wrap_content"

style="?android:attr/progressBarStyleLarge" />


android:layout_height="wrap_content"

android:text="水平进度条" />


android:layout_height="wrap_content"

style="?android:attr/progressBarStyleHorizontal"

android:max="100"

android:progress="30" />

android:layout_width="fill_parent"

android:layout_height="wrap_content"

style="?android:attr/progressBarStyleHorizontal"

android:max="100"

android:progress="30"

android:secondaryProgress="60"

android:layout_marginTop="20dp" />




android:orientation="horizontal"

android:layout_width="fill_parent"

android:layout_height="fill_parent">


免费下载 ×

下载APP,支持永久资源免费下载

下载APP 免费下载
温馨提示
请用电脑打开本网页,即可以免费获取你想要的了。
扫描加我微信 ×

演示

×
登录 ×


下载 ×
论文助手网
论文助手,最开放的学术期刊平台
				暂无来源信息			 
回复
来来来,吐槽点啥吧

作者联系方式

×

向作者索要->