1. Android的发展和历史
Android是Andy Rubin创立的操作系统,后来被Google收购。
1.1 Android的发展和简介
目前android已经成为智能手机上主流的操作系统。
1.2 Android平台架构及特性
Android系统底层建立在linux操作系统之上, 该平台由操作系统、中间件、用户界面和应用软件4层构成,采用软件层叠(software stack)的方式构建。这使得层与层之间相互分离,层间低耦合。
从上图可以看出,Android操作系统主要由五部分构成:
- 应用程序层
包括一系列核心的应用程序以及编写的应用程序。
- 应用程序框架
提供大量API供开发者使用,是学习android的主要内容。应用程序框架还是软件复用的手段,任何应用程序都可以发布功能模块,只要遵守框架的约定,其他应用程序就可以使用这个模块。
- 函数库
Andriod包含一套被不同组件所使用的C/C++库的集合。一般开发者不能直接调用,但是可以通过应用程序框架来调用这些库。如:系统C库,媒体库,Surface Manager,LibWebCore,SGL,3D Library,Freetype,SQLite等。
- Android运行时
Android运行时由Android核心库集和Dalvik虚拟机构成。核心库集提供了Java语言核心库所能使用的绝大部分功能,Dalvik主要用来运行android应用程序。
每个Android应用程序都运行在单独的Dalvik虚拟机内,每个Android应用程序对应一条Dalvik进程,Dalvik专门针对同时运行多个虚拟机进行了优化,android系统以方便的实现对应用程序进行隔离。
Dalvik虚拟机和JVM区别:Dalvik并未完全遵守JVM规范,两者不兼容。JVM运行的是Java字节码(.class),Dalvik运行的是专门的dex文件。JVM直接从.class或JAR包中加载字节码运行,Dalvik需要将.class文件编译成.dex文件然后运行。
Dalvik虚拟机适合在移动端使用,相对于PC不需要很快的CPU计算速度和大量内存,主要特点有:
1) 运行专门的.dex文件,减少了.class文件中的冗余信息,提高了运行性能,DX工具还会对.dex文件进行性能优化。
2) 基于寄存器实现。大多数虚拟机(JVM)是基于栈,Dalvik基于寄存器,有更好的性能表现,但是硬件通用性略差。
- Linux内核
Android内核建立在linux 2.6之上,linux内核提供了安全性、内存管理、进程管理、网络协议栈、驱动模型等核心系统服务,他是系统硬件和软件层叠之间的抽象层。
2. 搭建Android开发环境
2.1 下载和安装Android SDK
2.2 安装、运行和调试环境
2.3 安装Eclipse和ADT插件
3. Android常用开发工具用法
3.1 在命令行创建、删除和浏览AVD
通过android list或android list avd命令查看已经安装的AVD。
创建新的AVD:
android create avd -n <avd 名称> -t <android版本> -b <CPU架构> -p <avd设备保存位置> -s <avd皮肤>
3.2 使用Android模拟器
Android模拟器是运行在电脑上的虚拟手机,启动方式:
- emulator -avd <avd名称>
- emulator -data <镜像文件名称>
3.3 使用Dalvik Debug Monitor Service(DDMS)进行调试
一个功能强大的调试环境。主要有线程面板、信息输出面板、线程跟踪面板、Heap内存跟踪面板、模拟器控制面板、文件管理对话框等。
3.4 Android Debug Bridge(ADB)用法
ADB可以完成模拟器文件与电脑文件的相互复制。也可以安装apk应用,甚至可以切换到android系统中执行linux命令。
3.5 使用DX编译Android应用
Android使用Dalvik虚拟机运行.dex文件,DX工具将.class文件转化为.dex文件。
DX工具命令格式:
dx -dex [--dump-to=<file>] [--core-library] [<file>.class | <file>.{zip,jar, apk} | <directory>]
[--dump-to=<file>]指定生成的*.dex文件名;
[--core-library]指定需要转换的.class, .jar, .zip文件或目录。
dx -dex --dump-to=g:\a.dex --core-library d:\helloworld\bin
3.6 使用Android Asset Packaging Tool(AAPT)打包资源
android应用通常会包含很多资源,当我们发布一个apk包时,这些资源必不可少,需要用aapt进行打包。
- aapt -l[ist]:列出资源压缩包内的内容
- aapt -d[ump]:查看apk包内的指定的内容
- aapt -p[ackage]:打包生成资源压缩包
- aapt -r[emove]:从压缩包中删除指定文件
- aapt -a[dd]:向压缩包中添加指定文件
- aapt -v[ersion]:打印aapt版本
aapt -A <附件资源路径> -S <资源路径> -M <android应用清单文件> -I <额外添加的包> And -F 目标文件路径
3.7 使用mksdcard管理虚拟SD卡
4. 第一个Android应用
4.1 使用Eclipse开发第一个android应用
使用Eclipse开发Android应用的步骤:创建Android应用,在XML布局文件中定义用户界面,在Java代码中编写业务实现。
Android应用的包名非常重要,可以作为Android应用的唯一标识。
4.2 通过ADT运行Android应用
通过Eclipse提供的ADT插件运行Android应用:
- 通过Android提供的AVD管理器或者直接通过emulator命令运行指定的AVD设备;
- 选中指定的Android项目运行
5. Android应用结构分析
使用main.xml定义用户界面,Java代码编写业务实现。
5.1 创建一个Android应用
create project子命令
android create project -n HelloWorld -t android-17 -p F:\adt-bundle-windows-x86-20130219\workspace\HelloWorld -k org.bigminer.helloworld -a HelloWorld
说明: -n 指定创建项目的名称
-t指定项目针对的android平台
-p指定项目保存路径
-k指定项目包名
-a指定Activity名称
运行命令后,会在指定目录下创建HelloWorld文件夹,以及相关的子目录及文件。
1) src目录是保存Java源文件的目录。
2) res目录存放各种资源文件,如layout子目录下存放界面布局文件,values子目录下存放xml格式的各种资源文件。
3) AndroidManifest.xml是android项目的系统清单文件,控制android应用的名称、图标、访问权限等整体属性。除此之外,android应用的Activity、Service、ContentProvider、BroadcastReceiver四大组件都需要在该文件中配置。
4) build.xml文件是android为该项目提供的一个Ant生成文件。通过该生成文件,开发这可以通过Ant来生成、安装Android项目。
注:创建项目以后,使用ant之前要确保电脑中安装了ant工具,下载Ant安装文件:apache-ant-1.9.5-bin.zip,解压之后,要将目录增加到环境变量PATH中。
ant debug:
之后在目录:F:\adt-bundle-windows-x86-20130219\workspace\HelloWorld\bin会出现对应的apk文件;
安装:ant debug install
在模拟器上就会有HelloWorld的APP图标了。
5.2 自动生成的R.java
R.java是aapt工具根据应用中的资源文件自动生成的。可以将R.java视为android应用的资源字典。
aapt生成R.java的规则主要是以下两条:
- 每类资源对应R类的一个内部类。比如所有界面布局资源对应layout内部类;所有字符串资源对应string内部类,所有标识符资源对应id内部类。
- 每个具体的资源项对应内部类的一个public static final int类型的Field。
5.3 Res目录说明
Res目录存放了Android应用所用的全部资源,包括图片资源、字符串资源、颜色资源、尺寸资源等。不同资源放在不同目录下,方便AAPT生成R.java文件。
一旦定义了资源文件,android项目允许在Java代码和xml代码中使用资源。
- 在xml中使用资源:@<资源对应的内部类的类名>/<资源项目的名称>;
- 当我们在xml文件中使用标识符时,这些标识符无需使用专门的资源进行定义,直接在文档中定义:@+id/<标识符代码>;如果希望在Java代码中获取该组件,则使用Activity中的findViewById()方法;如果希望在xml文件中获取该组件,则使用:@id/<标识符代码>。
5.4 Android应用的清单文件:AndroidManifest.xml
AndroidManifest.xml是每个Android项目所必须的,是Android应用的全局描述文件。通常包含如下信息:
- 应用程序的包名,该包名做为该应用的唯一标识;
- 应用程序所包含的组件,如Activity、Service、ContentProvider、BroadcastReceiver等;
- 应用程序兼容的最低版本;
- 应用程序使用系统所需的权限声明;
- 其他程序访问该程序所需的权限声明。
5.5 应用程序权限说明
一个Android应用需要权限才能调用Android系统的功能,一个Android应用也可能被其他应用调用,因此需要声明调用自身需要的权限。
1、声明运行该应用本身所需要的权限:为<manifest>元素添加<uses-permission.../>子元素。
<!---声明需要打电话的权限--->
<uses-permission android:name="android.permission.CALL_PHONE"/>
2、声明调用该应用所需要的权限:通过为应用的各组件元素,如<activity>添加<uses-permission.../>子元素。
<!---声明需要打电话的权限--->
<uses-permission android:name="android.permission.SEND_SMS"/>
6 Android应用基本组件介绍
6.1 Activity和View
Activity是Android应用中负责和用户交互的组件。通过setContentView(view)来显示指定组件。
View是所有UI控件、容器控件的基类,view组件是android应用中用户实实在在看到的组件。view组件需要放到容器中或者用Activity将它显示出来。如果要通过某个activity把指定view显示下来,调用activity的setContentView(view)即可。
Activity为Android应用提供了可视化用户界面,如果需要多个用户界面,可以使用多个activity,组成activity栈,活动的activity位于栈顶。
Activity包含了一个setTheme(int resid)方法设置窗口的风格。
6.2 Service
Service通常位于后台不与用户交互,Service组件需要继承Service基类,一个Service组件运行起来之后,将有用自己独立的生命周期,Service组件通常用于为其他组件提供后台服务或监控其他组件的运行状态。
6.3 BroadcastReceiver
BroadcastReceiver代表广播消息接收器,类似于事件编程中的监听器。与监听器不同的是:普通事件监听器监听的事件源是程序中的对象;而BroadcastReceiver监听的事件源是android应用中的其他组件。
使用BroadcastReceiver组件接收广播消息,开发者只需要实现自己的BroadcastReceiver子类,并重写onReceive(Context context, Intent intent)方法即可。当其他组件通过sendBroadcast()、sendStickyBroadcast()、sendOrderedBroadcast()方法发送广播消息时,如果该BroadcastReceiver对该消息感兴趣(通过IntentFilter配置),BroadcastReceiver的onReceive方法就会被触发。
实现自己的BroadcastReceiver子类之后,有两种方法注册“事件监听器”
- Java代码中通过Context.registReceiver()方法注册BroadcastReceiver;
- 在AndroidManifest.xml文件中使用<receiver>元素完成注册。
6.4 ContentProvider
Android应用运行在各自的Dalvik虚拟机实例中,如果android应用之间需要实现实时数据交换,那么就要用到ContentProvider——跨应用的数据交换。用户实现自己的ContentProvider时,需要实现:
- insert(Uri, ContentValues): 向ContentProvider插入数据;
- delete(Uri, ContentValues):删除ContentProvider中指定的数据;
- update(Uri, ContentValues): 更新ContentProvider中指定数据;
- query(Uric, String[], String, String[], String): 从ContentProvider中查询数据。
通常ContentProvider与ContentResolver结合使用,一个应用使用ContentProvider暴露自己的数据,另一个应用使用ContentResolver访问数据。
6.5 Intent与IntentFilter
严格地说,Intent不是Android应用的组件,但是他是Android应用内不同组件间通信的载体,Intent可以启动应用中的另一个Activity,也可以启动一个Service组件,还可以发送一条广播消息来出发BroadcastReceiver。即Activity、Service、BroadcastReceiver三者通信都以Intent为载体,只是不同组件使用Intent的机制略有不同。
- 当需要启动一个Activity时,可以使用Context的startActivity(Intent intent)方法,或startActivityForResult(Intent intent, int requestCode)方法,intent参数封装了需要启动的Activity信息。
- 当需要启动一个Service时,可以使用Context的startService(Intent intent)方法,或bindService(Intent intent, ServiceConnection conn, int flags)方法,Intent参数封装了需要启动的Service信息。
- 当需要触发一个BroadcastReceiver时,调用Context的sendBroadcast(Intent intent)方法、sendStickyBroadcast(Intent intent)或sendOrderedBroadcast(Intent intent, String receiverPermission)方法发送广播消息。Intent参数封装了需要触发的BroadcastReceiver信息。
当一个组件通过Intent表示了需要启动或触发另一个组件的意图之后,意图可以分为两类:
- 显示Intent:显示Intent明确指定需要启动或触发的组件的类名;Android系统无需对该Intent做任何解析,系统直接找到目标组件启动或触发即可。
- 隐式Intent:隐式Intent指定了需要启动或触发的组件应该满足的条件;Android系统需要对该Intent做解析,解析出他的条件然后去系统中查找与之匹配的目标组件。(通过IntentFilter判断)
7 签名Android应用程序
Android应用程序以包名做为唯一的标识。但同一手机安装两个相同包名的应用会导致前一个被后一个覆盖。为避免此类情况,Android要求对做为产品发布的应用进行签名。
- 确定发布者的身份
- 确保应用的完整性