资源描述
2013年1月11日9:45:37
第一章 android应用于开发环境
1.Android系统的底层建立在Linux系统之上,该平台由操作系统、中间件、用户界面和应用软件组成,它采用一种被称为软件叠层的方式进行构建。
2.android系统的体系结构:
应用程序层
应用程序框架
函数库 android运行时
Linux内核
①应用程序层:各种应用程序
②应用程序框架:提供大量API框架供开发者使用
③函数库:包含一套被不同组件所使用的C/C++库的集合。一般来说,android应用开发者不能直接调用这套C/C++库集,但可以通过它上面的应用程序框架来调用这些库。
核心库:
1. 系统C库:一个从BSD系统派生出来的标准C系统库,并且专门为嵌入式Linux设备调整
2. 媒体库:基于PacketVideo的OpenCORE,这套媒体库支持播放和录制许多流行的音频和视频格式,以及查看静态图片。主要包括MPEG4、H.264、MP3、AAC、AMR、JPG、PNG等多媒体格式。
3. Surface Manager:管理对显示子系统的访问,并且可以对多个应用程序的2D和3D图层机提供无缝整合。
4. LibWebCore:一个全新的Web浏览器引擎,该引擎为android浏览器提供支持,也为WebVIew提供支持,WebView完全可以嵌入开发者自己的应用程序中
5. SGL:底层的2D图形引擎
6. 3Dlibraries:基于OpenGL ES1.0API实习的3D系统,这套3D库既可以使用硬件3D加速,也可以使用高度优化的、软件3D加速。
7. FreeType:位图和向量字体显示
8. SQLite:供所有应用程序使用的、功能强大的轻量级关系数据库
④android运行时
Android运行时由两部分组成:android核心库集和Dalvik虚拟机。其中核心库提供了Java语言核心库所能使用的绝大部分功能,而虚拟机则负责运行android应用程序
Dalvik虚拟机依赖于Linux内核的核心功能,如线程和底层内存管理。
⑤Linux内核
Android系统建立在Linux2.6之上,LInux内核提供了安全性、内核管理、进程管理、网络协议和驱动模型等核心系统服务。除此之外,Linux内核也是系统硬件和软件叠层之间的抽象层。
把android应用打包成一个可发布的APK包:
①通过DX工具对*.class文件进行转换。转换后通常得到一个*.dex文件
②通过AAPT工具打包所有的资源文件。打包后通常得到*.ap_文件
③通过apkbuilder工具把前2步得到的*.dex、*.ap_文件打包成APK包
Android UI方面:
android:id:该属性指定了该控件的唯一标识,在Java程序中可以通过findViewById(“id”)来获取指定的android界面组件
android:layout_width:指定该界面组件的宽度。如果该属性值为 fill_parent,则说明该组件与其父容器具有相同的宽度:如果该属性值为wrap_content,则说明该组件的宽度取决于它的内容-基本能包裹它的内容即可
android:layout_height:指定该界面组件的高度。如果该属性值为fill_parent,则说明该组件的高度与父容器相同;如果该属性值为wrap_content,则说明该组件的高度取决于它的内容-基本能包裹它的内容即可
Android应用程序:
1.在应用程序文件结构中res目录、src目录、AndroidManifest.xml文件时android项目所必须的,其它目录、文件都是可选的。
2.res目录存放android项目的各种资源文件,比如layout存放界面布局文件、values目录下则存放各种XML格式的资源文件,例如字符串资源文件:strings.xml;颜色资源文件:colors.xml;尺寸资源文件:dimens.xml。drawable-ldpi、drawable-mdpi、drawable-hdpi这三个子目录则分别存放小、中、大三种图片文件
3.src目录只是一个普通的、保存Java源文件的目录
4.AndroidManifest.xml文件时android项目的系统清单文件,它用于控制android应用的名称、图标、访问权限等整体属性
Java源程序中:
//设置使用xxx.xml文件定义的界面布局
setContentView(R.layout.xxx);
//获取UI界面中ID为R.id.xx的按钮
Button bn=(Button)findViewById(R.id.xx);
AndroidManifest.xml清单文件:
-》应用程序的包名,该包名将会作为该应用的唯一标识
-》应用程序所包含的组件,如Activity、Service、BroadcaseReceiver、ContentProvider
-》应用程序兼容的最低版本
-》应用程序使用系统所需的权限声明
-》其它程序访问该程序所需的权限声明
以下就是一个AndroidManifest.xml内容:
常用的权限:
Android应用程序的基本组件介绍
Android四大组件:Activity、Service、BroadcaseReceiver、ContentProvider
1. Activity和View
Activity是android应用程序中负责与用户交互的组件。Activity只能通过setContentView(View )来显示指定的组件
View组件是所以UI控件、容器控件的基类,View组件就是Android应用中用户实实在在看到的部分。但是View组件需要放到容器组件中,或者使用Activity将它显示出来。如果需要通过某个Activity把指定View显示出来,调用Activity的setContentView()方法即可。
setContentView()方法可接受一个View对象作为参数:
2. Service
Service与Activity的地位是并列的,它代表一个单独的Android组件。Service与Activity的区别在于:Service通常位于后台运行,它一般不需要与用户交互,印象Service组件没有图形用户界面。
与Activity组件需要继承Activity基类相似,Service组件需要继承Service基类。一个Service组件被运行起来之后,它将拥有自己独立的生命周期,Service组件通常用于为其它组件提供后台服务或监控其它组件的运行状态。
3. BroadcaseReceiver广播消息接收器
BroadcaseReceiver是android应用中另一个重要的组件,从代码实现角度来看,BroadcaseReceiver非常类似于事件编程中的监听器。与普通事件监听器不同的是:普通事件监听器的时间源是程序中的对象,而BroadcaseReceiver监听是事件源是android应用程序中的其它组件。
使用BroadcaseReceiver组件接收广播消息比较简单,开发者只要实现自己的BroadcaseReceiver子类,并重写onReceive(Context context,Intent intent)方法即可。当其它组件通过sendBroadcase()、sendStickyBroadcase()或sendOrderedBroadcase()方法发送广播消息时,如该BroadcaseReceiver也对该消息“感兴趣”(通过IntentFilter配置),BroadcaseReceiver的onReceive(Context context,Intent intent)方法将会被触发。
开发者实现了自己的BroadcaseReceiver之后,通常有两种方式来注册这个系统级的“事件监听器”
①在Java代码中通过Context.registReceiver()方法注册BroadcaseReceiver
②在AndroidManifest.xml文件中使用<receiver....../>元素完成注册
4. ContentProvider
对于android应用而言,它们必须相互独立,各自运行在自己的Dalvik虚拟机实例中,如果这些android应用之间需要实现实时的数据交换。例如我们开发了一个方式短信的程序,当方式短信时需要从联系人管理应用中读取指定联系人的数据-这就需要多个应用程序之间进行实时的数据交换。
5. Android系统为这种跨应用的数据提供了一个标准:ContentProvider。当用户实现自己的ContentProvider时,需要实现如下抽象方法
-》Insert(Uri,ContentValues):向ContentProvider插入数据
-》delete(Uri,ContentValues):删除ContentProvider中指定数据
-》update(Uri,ContentValues,String,String[]):更新ContentProvider中指定数据
-》query(Uri,String[],String,String[],String):从ContentProvider查询数据
Intent和IntentFilter
Intent并不是Android应用的组件,但它对于android应用的作用非常大----它是android应用内不同组件之间通信的载体。当android运行时需要连接不同的组件时,通常就需要借助于Intent来实现。Intent可以启动应用程序中另一Activity,也可以启动一个Service组件,还可以发送一条广播消息来触发系统中的BroadcaseReceiver,也就是说,Activity、Service、BroadcaseReceiver三种组件之间通信都以Intent作为载体,只是不同组件使用Intent的机制略有区别而已。
-》当需要启动一个Activity时,可调用Context的startACtivity(Intent intent)方法,该方法中的Intent参数封装了需要启动的目标Activity的信息
-》当需要启动一个Service时,可调用Context的startService(Intent intent)方法或bindService(Intent Service,ServiceConnection conn,int flags)方法,这两个方法中的Intent参数封装了需要启动的目标Activity的信息
-》当需要触发一个BroadcaseReceiver时,可调用Context的sendBroadcase(Intent intent)、sendStickyBroadcase(Intent intent)或sendOrderedBroadcase(Intent intent,String receiverPermission)方法来发送广播消息,这三个方法中的Intent参数封装了需要触发的目标BroadcaseReceiver的信息。
当一个组件通过Intent表示了启动或触发另一个组件的“意图”之后,这个意图分为两类:
-》显示Intent:显示Intent明确指定需要启动或者触发的组件的名称
-》隐式Intent:隐式Intent只是指定需要启动或者触发的组件应满足怎样的条件
对于现实Intent而言,android系统无需对该Intent做任何解析,系统直接找到指定的目标组件,启动或触发它即可。
对于隐式Intent而言,android系统需要对该Intent进行解析,解析出它的条件,然后再去系统中查找与之匹配的目标组件。如果找到符合条件的组件,就启动或触发它们。
那么android系统如何判断被调用组件是否符合隐式Intent,这就需要靠IntentFilter来实现了,被调用组件可通过IntentFIlter来声明自己所满足的条件-----也就是声明自己到底能处理哪些隐式Intent。
展开阅读全文