背景
在十一月初,Google联合34家企业成立了开放手机联盟(Open Handset Alliance)。同时,该联盟面向全球推出基于 Linux的手机操作系统“Android”,该平台是完全意义上的开放性、综合性的移动设备平台。
What is Android?
Aandroid是包括基于移动设备上的操作系统、中间件、关键应用的一组软件。而Android SDK提供了在Android平台上开发的必要的工具和APIs,该平台是基于Java语言开发的。
Android的SDK的下载和安装
平台简介
这个平台有以下功能:
Application framework:
可重用的和可替换的组件部分,在这个层面上,所有的软件都是平等的。
Dalvik virtul machine:
一个基于
Linux
的虚拟机。
Integrated browser:
一个基于开源的
WebKit
引擎的浏览器,在应用程序层。
Optimized graphics:
包含一个自定义的
2D
图形库和基于
OpenGL ES 1.0
标准的
3D
实现。
SQLite:
数据库
Media support:
通用的音频,视频和对各种图片格式的支持
(MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF)
GSM Telephony: GSM
移动网络
,
硬件支持。
Bluetooth, EDGE, 3G, and WiFi:
都依赖于硬件支持。
Camera, GPS, compass, and accelerometer:
都依赖于硬件支持。
Rich development environment:
包含一套完整的开发工具集,方便跟踪调试,内存检测和性能测试,而且提供了
Eclipse
的插件。
开发环境简介
先介绍一下开发环境,下面是对系统及相关软件的版本要求:
操作系统:
Windows XP or Vista
Mac OS X 10.4.8 or later (x86 only)
Linux (tested on Linux Ubuntu Dapper Drake)
Supported Development Environments
Eclipse: Eclipse 3.2, 3.3 (Europa)
Android Development Tools plugin (optional)
Other development environments or IDEs
JDK 5 or JDK 6 (JRE alone is not sufficient)
Not compatible with Gnu Compiler for Java (gcj)
Apache Ant 1.6.5 or later for Linux and Mac, 1.7 or later for Windows
SDK下载和安装
2.将下载后的SDK的压缩包解压到适当的位置就可以了。
3.下一步设置$SDK_ROOT/tools在你的机器的环境变量中。
现在,你可以使用运行命令:emulator.exe -skin QVGA-P启动Android的模拟器了。
下面介绍Eclipse插件ADT的安装和使用:
1.启动Eclipse,然后选择
Help
>
Software Updates
>
Find and Install...
.
2.在resulting daialog box中,键入一个新的名称(比如:Android Plugin),然后输入它的URL:
https://dl-ssl.google.com/android/eclipse/
3.然后点击完成
安装Android Plug完成后,重启Eclipse
1.选择
Window
>
Preferences...
,打开
Preferences panel
2.选择 Android 项
3.在SDK Location项中,点击Browser…,然后选择SDK的的根目录即可(注意:不要选择tool目录)
这一切安装完毕之后,我们可以在Project中新建一个Android的工程了。下面是一个利用ADT创建一个Hello World的例子。
Hello,World程序演示
1
, 创建一个新的
Android
项目
启动
Eclipse,
选择
File -> New -> Project
菜单
,
如果你安装好了
Android
的
Eclipse
插件,你将会在弹出的对话框中看到
"Android Project"
的选项。
选择
“Android Project”,
点击
Next
按钮。
2,
填写项目的细节参数
.
下面的对话框需要你输入与项目有关的参数:
这个表格中详细介绍了每个参数的含义
:
Project Name:
包含这个项目的文件夹的名称。
Package Name:
包名,遵循
JAVA
规范,用包名来区分不同的类是很重要的,例子中用到的是
"com.google.android",
你应该按照你的计划起一个有别于这个的路径的名称。
Activity Name:
这是项目的主类名,这个类将会是
Android
的
Activity
类的子类。一个
Activity
类是一个简单的启动程序和控制程序的类。它可以根据需要创建界面,但不是必须的。
Application Name:
一个易读的标题在你的应用程序上。
在
"
选择栏
"
的
"Use default location"
选项,允许你选择一个已存在的项目。
3,编辑自动生成的代码。
当项目创建后,你刚才创建的
HelloAndroid
就会是包含下面的代码
.
public class HelloAndroid extends Activity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle)
{
super.onCreate(icicle);
setContentView(R.layout.main);
}
}
当一个项目建立好以后,最直接的效果,就是在屏幕上显示一些文本,下面是完成后的代码
:
public class HelloAndroid extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
TextView tv = new TextView(this);
tv.setText("Hello, Android");
setContentView(tv);
}
}
程序代码已经写好,下面运行一下:
最简便的运行方式是:右击你的Android工程,然后选择Run As ->Android Application,即可运行了
Android应用程序解析
在Android应用程序中有四个构建模块:
Activity(活动)
Intent Receiver(意图接受器/活动接受器)
Service(服务)
Content Provider(内容提供器)
Android应用程序的四种构建介绍
并不是每个程序都需要所有的四个部分,你的程序可能用到它们其中一些的组合。
一旦你决定在你的程序中需要哪个组件,你应该在一个叫
AndroidManifest.xml
的文件中列出它们。你在这个
XML
文件中声明程序中用到的组件和它们的用途和需要。
u
Activity
Activity
是
Android
构造块中最基本的一种,在应用中,一个
activity
通常就是一个单独的屏幕。每一个
activity
都被实现为一个独立的类,并且继承于
Activity
这个基类。这个
activity
类将会显示由几个
Views
控件组成的用户接口,并对事件做出响应。大部份的应用都会包含多个的屏幕。例如,一个短消息应用程序将会有一个屏幕用于显示联系人列表,第二个屏幕用于写短消息,同时还会有用于浏览旧短消息及进行系统设置的屏幕。每一个这样的屏幕,就是一个
activity
。从一个屏幕导航到另一个屏幕是很简单的。在一些应用中,一个屏幕甚至会返回值给前一个屏幕。当一个新的屏幕打开后,前一个屏幕将会暂停,并保存在历史堆栈中。用户可以返回到历史堆栈中的前一个屏幕。当屏幕不再使用时,还可以从历史堆栈中删除。默认情况下,
Android
将会保留从主屏幕到每一个应用的运行屏幕。
Android
使用了
Intent
这个特殊类,实现在屏幕与屏幕之间移动。
Intent
类用于描述一个应用想要做什么事。
一个屏幕到另一个屏幕之间的导航是通过解析意图(
Intent
)来实现的。当向前导航时,
activity
将会调用
startActivity (Intent myIntent)
方法。然后,系统会在所有安装的应用程序中定义的
IntentFilter
中查找,找到最匹配
myIntent
的
Intent
对应的
activity
。新的
activity
接收到
myIntent
的通知后,开始运行。当
startActivity
方法被调用将触发解析
myIntent
的动作,这个机制提供了两个关键好处:
l
Activity
能够简单的通过在
Intent
表中发送请求,从其他组件中复用功能
l
Activity
能够在任何时候由一个带有相同
IntentFilter
的
Activity
替换
u
Intent Revicer
当你希望你的应用能够对一个外部的事件(如当电话呼入时,或者数据网络可用时,或者到了晚上时)做出响应,你可以使用一个
Intent Receiver
。虽然
Intent Receiver
在感兴趣的事件发生时,会使用
NotificationManager
通知用户,但它并不能生成一个
UI
。
u
Service
一个
Service
是一段长生命周期的,没有用户界面的程序。比较好的一个例子就是一个正在从播放列表中播放歌曲的媒体播放器。在一个媒体播放器的应用中,应该会有多个
activity
,让使用者可以选择歌曲并播放歌曲。
u
Content Provider
应用程序能够将它们的数据保存到文件中、
SQL
数据库中,甚至是任何有效的设备中。当你想将你的应用数据与其它的应用共享时,
Content Provider
将会很有用。一个
Content Provider
类实现了一组标准的方法,从而能够让其它的应用保存或读取此
Content Provider
处理的各种数据类型。
Android应用程序中几种配置文件介绍
在Android的应用程序中,有res的文件夹,这里面包含着layout和 values这两类的xml配置文件。
lLayout顾名思义,就是作为布局使用的定义文件,其中包含了默认的启示项。所有的Android布局文件必须以XML头为开始:<?sml version="1.0" encoding="utf-8"?> 。同样,下一条定义通常(但不完全)是一个某种类的布局定义,在这个例子中是LinearLayout,也就是水平布局的意思。Android的XML名字空间应该总是定义在xml文件中组件或布局的最上级,这样标签"android:"才能用在文件的其余部分: xmlns:android="
http://schemas.android.com/apk/res/android"
更加详尽的布局定义,建议参考Android文档的
《
Designing Your Screen in XML
》部分。
lValues部分定义的是应用程序中的资源,诸如颜色配置、数组定义、风格样式等等。这里有String.xml,我们可以为应用程序添加所需的字符串资源。例如:<string name="confirm">Confirm</string>这个资源,我们可以在定义UI的布局定义中使用到它。例如:
<Button id="@+id/confirm"
android:text="@string/confirm"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
l最后,讲一下AndroidManifest.xml文件。AndroidManifest.xml 是让Android系统理解你的应用的一种方式.这个文件定义了应用的种类、在启动和设置时在哪显示它(或者是否显示)、应用定义了哪些活动、服务和内容提供者、它能接收哪些Intent,等等。在新的活动能被Android系统识别前,它需要在AndroidManifest.xml 文件中有它自己的活动条目。这让系统知道它的存在并且能被调用。例如:<activity class=".NoteEdit"/>
更为详尽的介绍请参见文档的《The AndroidManifest.xml》部分。
程序演示
Android应用程序的生命周期
在多数情况下,每个
Android
应用运行在自己的
Linux
进程中。当一个应用的某段
code
需要运行的时候这个进程将会被创建,直到不再需要该应用或系统要为其他的应用释放内存的时候才停止。
一个非常重要且少有的特性是,应用进程的存活时间不是由这个应用直接控制的。而是由系统决定的,系统会根据每个已知的正在运行的应用情况来定夺,包括,该应用对用户的重要性和系统全部可用内存。
为了决定在内存较低的时候杀掉哪个进程,
Android
会根据运行在这些进程内的组件及他们的状态把进程划分成一个
"
重要程度层次
"
。其重要的程度按以下规则排序:
前端进程
可以是一个持有运行在屏幕最前端并与用户交互的
Activity
的进程
(onResume
方法被调用时
)
,也可以是持有一个正在运行的
IntentReceiver(
也就是说他正在执行自己的
onReceiveIntent
方法
)
的进程。在系统中,只会有少数这样的进程,并且除非内存已经低到不够这些进程运行,否则系统不会主动杀掉这些进程。这时,设备通常已经达到了需要内存整理的状态,所以杀掉这些进程是为了不让用户界面停止响应。
可视进程
是持有一个被用户可见,但没有显示在最前端
(onPause
方法被调用时
)
的
Activity
的进程。举例来说,这种进程通常出现在一个前端
Activity
以一个对话框出现并保持前一个
Activity
可见时。这种进程被系统认为是极其重要的,并且通常不会被杀掉,除非为了保持所有前端进程正常运行不得不杀掉这些可见进程。
服务进程
是持有一个
Service
的进程,该
Service
是由
startService()
方法启动的,尽管这些进程用户不能直接看到,但是通常他们做的工作用户是十分关注的
(
例如,在后台播放
mp3
或是在后台下载、上传文件
)
,所以,除非为了保持所有的前端进程和可视进程正常运行外,系统是不会杀掉服务进程的。
后台进程
是持有一个不再被用户可见的
Activity(onStop()
方法被调用时
)
的进程。这些进程不会直接影响用户体验。加入这些进程已经完整的,正确的完成了自己的生命周期
(
访问
Activity
查看更多细节
)
,系统会在为前三种进程释放内存时随时杀掉这些后台进程。
空进程
是没有持有任何活动应用组件的进程。保留这种进程的唯一理由是为了提供一种缓存机制,缩短他的应用下次运行时的启动时间。
最后说一下Activity的生命周期。一个Activity是有生命周期的,从onCreate()开始,onDestroty()结束,中间还有onStart(),onResum(),onStop(),onRestart()等等状态。有一个详细的介绍图片: