上篇Android开发之旅:应用程序基础及组件介绍了应用程序的基础知识及Android的四个组件,本篇将介绍如何激活组关闭组件等。本文的主题以下:html
当接收到ContentResolver发出的请求后,内容提供者被激活。而其它三种组件——活动、服务和广播接收者,被一种叫作意图(intent)的异步消息激活。意图是一个保存着消息内容的Intent对象。对于活动和服务来讲,Intent对象指明了请求的操做名称以及做为操做对象的数据的URI和其它一些信息。例如,它能够传递对活动的一个请求,让它为用户显示一张图片,或者让用户编辑一些文本。而对于广播接收者而言,Intent对象指明了广播的行为。例如当照相按钮被按下,它能够对全部感兴趣的对象广播。android
对于每种组件来讲,激活的方法是不一样的。下面将分别介绍活动、服务、广播接收者组件的激活方法。app
经过传递一个Intent对象至Context.startActivity()或Activity.startActivityForResult()以载入(或指定新工做给)一个活动。相应的活动能够看到初始的意图,这个意图经过getIntent() 方法来查看激活活动。Android调用活动的onNewIntent()方法传递任何后续的意图。异步
一个活动常常启动了下一个。若是它指望它所启动的那个活动返回一个结果,它会调用startActivityForResult()而不是startActivity()。例如,若是它启动了一个活动让用户挑选一张照片,它可能会返回被选中的照片。结果以一个Intent对象传递调用活动的onActivityResult() 方法。ide
经过传递一个Intent对象至Context.startService()以启动一个服务(或给予正在运行的服务以一个新的指令)。Android调用服务的onStart()方法并将Intent对象传递给它。post
与此相似,一个Intent能够传递给Context.bindService()以在调用的组件和目标服务之间创建持续的链接。这个服务会在调用onBind() 方法中接受这个Intent对象(若是服务还没有启动,bindService()会先启动它)。例如,一个活动能够链接至前面讲到的音乐播放服务,并提供给用户一个可操做的(用户界面)以对播放进行控制。这个活动能够调用bindService()来创建链接,而后调用服务中定义的对象来控制播放。spa
应用程序能够经过将Intent对象传递给code
及其它相似方法来产生一个广播。Android会经过onReceive()方法将intent传递给全部对此广播有兴趣的广播接收者。xml
内容提供者仅在响应ContentResolver提出请求的时候激活。而一个广播接收者仅在响应广播信息的时候激活。因此,没有必要去显式的关闭这些组件。htm
而活动则不一样,它提供了用户界面。与用户进行会话,因此只要会话依然持续,哪怕对话进程空闲,它都会一直保持激活状态。与此类似,服务也会在很长一段时间内保持运行。因此Android提供方法有序地关闭活动和服务。
当组件再也不被使用的时候或者Android必需要为更多活跃的组件回收内存时,组件也可能会被系统关闭。
当Android启动一个应用程序组件以前,它必须知道那个组件是存在的。因此,应用程序会在一个清单(manifest)文件中声明它的组件,这个文件会被打包到Android包中。这个.apk文件还将包括应用程序的代码、文件以及其它资源。
这个清单文件是XML结构的文件,且全部的Android应用程序都把它叫作AndroidManifest.xml。为声明一个应用程序组件,它还会作不少额外工做,好比指明应用程序所需连接到的库的名称(除了默认的Android库以外)以及声明应用程序指望得到的各类权限。
但清单文件的主要功能仍然是向Android声明应用程序的组件。举例说明,一个活动能够以下声明:
<?xml version="1.0" encoding="utf-8"?>
<manifest . . . >
<application . . . >
<activity android:name="com.example.project.FreneticActivity"
android:icon="@drawable/small_pic.png"
android:label="@string/freneticLabel"
. . . >
</activity>
. . .
</application>
</manifest>
<activity>元素的name属性指定了实现了这个活动的Activity类的子类,icon和label属性指向了包含展现给用户的此活动的图标和标签的资源文件。
其它组件也以相似的方法声明——<service> 元素用于声明服务,<receiver> 元素用于声明广播接收者,而<provider>元素用于声明内容提供者。清单文件中未进行声明的活动、服务以及内容提供者将不为系统所见,从而也就不会被运行。然而,广播接收者既能够在清单文件中声明,也能够在代码中动态的建立(做为BroadcastReceiver
对象)且调用Context.registerReceiver()方式注册到系统。
Intent对象能够显式地指定目标组件。若是进行了这种指定,Android会找到这个组件(依据清单文件中的声明)并激活它。但若是Intent没有进行显式的指定,Android就必须为它找到对于intent来讲最合适的组件。这个过程是经过比较Intent对象和全部可能对象的intent过滤器完成的。组件的intent过滤器会告知Android它所能处理的intent类型。如同其它关于组件的必要信息同样,它们在清单文件中进行声明的。这里是上面示例的一个扩展,其中加入了针对活动的两个intent过滤器声明:
<?xml version="1.0" encoding="utf-8"?>
<manifest . . . >
<application . . . >
<activity android:name="com.example.project.FreneticActivity"
android:icon="@drawable/small_pic.png"
android:label="@string/freneticLabel"
. . . >
<intent-filter . . . >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter . . . >
<action android:name="com.example.project.BOUNCE" />
<data android:mimeType="image/jpeg" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
. . .
</application>
</manifest>
示例中的第一个过滤器——action:“android.intent.action.MAIN”和category:“android.intent.category.LAUNCHER”的组合,是常见的。它标记这个活动显示在应用程序启动器中,用户在设备上看到的可启动的应用程序列表。换句话说,这个活动是应用程序的入口,是用户选择运行这个应用程序后所见到的第一个活动。第二个过滤器声明了这个活动针对特定类型的数据。
一个组件能够拥有任意数量的intent过滤器,每一个声明一系列不一样的能力。若是它没有包含任何过滤器,它将只能被显式声明了目标组件名称的意图激活。
对于广播接收者,它在代码中建立并注册intent过滤器,直接做为IntentFilter的对象实例化。其它过滤器则在清单文件中设置。
若是您如今对这些概念尚未彻底理解,不要紧这里我仅是让你们有个印象,知道这些概念或术语的存在,知道他们大概是作什么的。后面我还将陆续更详细地到这些东西并结合一些实例,到时候您就会清楚地知道这些东西。
做者:吴秦出处:http://www.cnblogs.com/skynet/