所有Android程式的运作流程,都定义在Activity中。
Android系统与其他系统很不一样的地方时:它的应用程式并不直接与底层系统紧密结合,而是跑在Android框架中。这意思是设计Android应用程式时,我们并不需要关心实际上运作的机器是哪一牌的手机或是哪一种嵌入式系统,或使用哪一种架构(ARM、X86、MIPS),我们要关心的只有Android框架提供了哪些功能,好让我们能操作这台设备。具体来说就是我们只要知道这台机器的屏幕大小、有没有键盘,有没有支持GPS等等信息,就知道我们写的应用程序是否能在这台机器上顺畅地运作。Android框架与底层系统的整合问题完全可以留给底层工程师来操心。
在执行【startActivity】函数时,应用程序并不是直接呼叫另一个Activity,而是将【Intent】传进Android框架中。Android框架会查看【startActivity】呼叫所传入的动作与Intent内容是否在注册表中,如果符合,就启动对应的服务或Activity。
Android系统中的每一个应用程序,在安装的过程中,都得事先在Android框架中注册、登记这个应用程序所建立的Activity,并事先注明会使用到的服务。比如当我们在Android上安装我们撰写的BMI应用程序时,BMI应用程序就会向Android框架登记相关咨询:BMI应用程序将会用到【Bmi】这个Activity。
这份信息存在于每个Android应用项目根目录下的【AndroidManifest.xml】文档中。如果我们在程式里,要用到其他应用程序或服务所提供的功能,也需一并在此列出。
在安装应用程序的时候,Android框架会根据应用程式提供的这份清单,将资讯注册于Android框架的注册表中。
备注:
Android应用程序的运作流程,存在于四种载体中:
1、Activity 2、Broadcast Intent Receiver 3、Service 4、Content Provider
预设的Activity 清单
我们使用eclipse Android 开发工具打开「BMI/AndroidManifest.xml 」档案。切换到
「AndroidManifest.xml」分页标签,查看预设的「BMI/AndroidManifest.xml」档案原始码:
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http:/ /schemas.and roid.co m/apk/ res/and roid"
package="com.demo.and roid.b mi"
android:versionCode="1"
android:versionName="1.0.0" >
<application android:icon="@drawable/icon" >
<activity
android:name=".Bm i" android:label="@string /app_name" >
<intent-filter >
<action android:name="and roid.intent.action.M AIN" />
<category android:name="and roid.intent.categor y.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
我们分行讲解如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http:/ /schemas.and roid.co m/apk/ res/and roid"
....>
....
</manifest>
【AndroidManifest.xml】这个文档也是以XML格式描述的,每个Android应用程序都需要一个【AndroidManifest.xml】文档,每份【AndroidManifest.xml】文档的开头都会出现这段叙述。而整个【AndroidManifest.xml】文档的叙述,都包含在【manifest】这个主要标签中。
package = "com.demo.android.bmi"
【package】是【manifest】(清单)标签的一个特别属性,范例中的内容可用来标明,这个应用程序的进入点存在于【com.demo.android.bmi】这个命名空间中。
android: versionCode="1"
android: versionName="1.0.0"
【android: versionCode】和【android: versionName】是应用程序版本号。这两个属性是可选的。【android: versionName】是给使用者看的版本号;【android:versionCode】则是开发者用的内部版本号,一般使用流水号。
<application android:icon="@drawable/icon"> …… </application>
【manifest】标签中主要包含一个【application】标签(备注1)。【application】标签里面,定义了所有这个应用程序用到的Activity、服务等信息。【application】标签中的【android:icon】属性,定义了这个应用程序将显示在Android主画面中的应用程序图示。【android:icon="@drawable/icon"】表示应用程序图示的资源存在于【res/drawable/icon】中。图示的大小必须超过64X64pix。
<activity android:name=".Bmi" android:label="@string/app_name"> …… </activity>
【application】标签中所有用到的Activity,都要包含在一个个【activity】标签中(备注2)。Activity是Android应用程序与使用者互动的主要元素,当使用者开启一个应用程序,第一个看到的画面就是一个Activity。若是一个应用程序中包含多个画面时,会定义多个不同的Activity,我们也必须在【application】标签中,使用多个【activity】标签,为不同的Activity添加描述。如果我们已经在程序代码中定义好了Activity,却忘记了在【AndroidManifest.xml】文档中加入对应的【activity】标签,那么在执行中呼叫到这个Activity的时候,将无法开启这个Activity。
【activity】标签的【android:name】属性,指出了这个Activity所对应的类别(class),【android:label】属性,则用来指定这个【activity】的代号。
因为在上一层【Manifest】标签属性中已经定义了【package="com.demo.android.bmi"】,因此在【activity】标签的【android:name】属性中,【.Bmi】代表着【com.demo.android.bmi.Bmi】的简写。也可以写成【Bmi】,一样是代表【com.demo.android.bmi.Bmi】这个类别。
<intent-filter>
<action android:name="android.intent.anction.MAIN" />
<category android:name="android.intent.category.LAUNCHAR" />
</intent-filter>
【intent-filter】标签定义了这个【activity】的性质。【intent-filter】中主要包含了两个标签:【action】和【category】标签。【action】标签中的【android:name】属性,其内容【android:intent.action.MAIN】表示:这个Activity是此应用程序的进入点(就像程序中常见的main主程序)。常见的还有【android.intent.action.EDIT】等标签。【category】标签中的【android:name】属性,其内容【android.intent.category.LAUNCHER】表示:开启这个应用程序时,应先执行这个Activity。
我们把整个档案合到一起看,可以总结出这个档案所传达的信息:在【com.demo.android.bmi】路径下的【Bmi.java】这个文档中,已经以了一个主要的Activity;当我们打开Android的时候,显示的是位于【res/drawable/icon】的图标。一旦我们按下图示来启动这个应用程序,Dalvik虚拟机会去寻找到定义了【android.intent.category.LAUNCHER】内容的【.Bmi】activity,并呼叫执行。
备注1:
除了【application】标签外,还有【uses-permission】(例如允不允许存取SMS、能否存取联络簿、相机功能等)、【permission】、【instrumentation】等主要标签。
备注2:
除了【activity】标签外,对应于Android应用程序的运作流程,还有【service】、【receiver】、【provider】等主要元素。