天天看点

Android SDK 1.5中文版 (Application基础—2)

1.1.1 激活组件:Intent

当接收到ContentResolver发出的请求后,内容提供者被激活 。而其它三种组件──活动(Activity)、服务和广播接收器被一种叫做Intent的异步信息所激活 。 Intent是一个保存着信息内容的Intent对象。对于Activity和服务来说,它指明了请求的操作名称以及作为操作对象的数据URI和其它一些 信息。比如说,它可以为Activity传递一个请求向用户显示一张图片,或者让用户编辑一些文本。而对于广播接收器而言,Intent对象则指明了通知 的行为。比如,它可以通知所有感兴趣的对象照相按钮被按下。

激活不同类型的组件的方法 是不同的:

  • 传递一个Intent对象至Context.startActivity()或Activity.startActivityForResult()启动一个Activity (或其他假定的新任务) 。相应的Activity可以通过调用getIntent()方法来查看激活它的Intent对象。Android通过调用Activity的onNewIntent()方法来向Activity传递新的Intent。

    Activity通常启动其他的Activity。如果它期望它所启动的那个Activity返回一个结果,会调用 startActivityForResult()来取代startActivity()。比如说,如果启动了另外一个Activity以使用户挑选一张 照片,它应该希望返回被选中的照片。结果将会被封装在一个Intent对象中,并传递给启动Activity的onActivityResult()方 法。

  • 通过传递一个Intent对象至Context.startService()将启动一个服务(或给予正在运行的服务一个新的指令) 。Android调用服务的onStart()方法并将Intent对象传递给它。

    与此类似,Intent可以被组件传递给Context.bindService()以建立与一个正在运行的目标服务的连接。服务通过其onBind() 方法获取这个Intent对象(如果服务尚未启动,bindService()会先启动它)。比如,一个Activity可以连接至上述的音乐回放服务, 并提供给用户一个可操作的(用户界面)以对回放进行控制。这个Activity可以调用bindService()来建立连接,然后调用服务定义的对象来 控制回放。后面一节:远程方法调用将更详细的阐明如何绑定至服务。

  • 应用程序可以将Intent对象传递给Context.sendBroadcast()、Context.sendOrderedBroadcast()和Context.sendStickyBroadcast()方法、以及他们的任何变种形式来产生一个广播 。Android会调用所有对此广播有兴趣的广播接收器的onReceive()方法,并将Intent传递给它们。

欲了解更多Intent消息的信息,请参阅章节Intent和Intent Filter(滤过器)。

1.1.2 关闭组件

内容提供者 仅在响应来自ContentResolver的请求时激活。而广播接收器 仅在响应广播消息的时候激活。所以,没有必要显式的关闭 这些组件。

而Activity则不同,它提供了用户界面。并与用户进行会话。所以只要会话依然持续,哪怕会话过程暂时停顿,它都会一直保持激活状态。与此相似,服务也会在很长一段时间内保持运行。所以Android为关闭Activity和服务提供了一系列的方法。

  • 可以通过finish()方法来关闭一个Activity。Activity可以通过调用另外一个Activity(它通过startActivityForResult()启动)的finishActivity()方法来关闭它。
  • 服务可以通过调用它的stopSelf()方法来停止,或者调用Context.stopService()。

系统也会在组件不再被使用的时候或者Android需要为活动组件提供更多内存的时候关闭它。后面组件的生命周期一节,将对这种情况进行更详细的讨论。

1.1.3 manifest文件

当Android启动一个应用程序组件之前,它必须知道哪个组件是存在的。所以,应用程序会在一个manifest文件中声明它的组件,这个文件被打包到Android包中。这个.apk文件还将包括应用程序的代码、文件以及其它资源。

这个manifest文件以XML作为结构格式,所有Android应用程序都叫AndroidManifest.xml。除了声明应用程序组件, 它还提供很多额外功能,比如指明应用程序所需链接的库名称(除了默认的Android库之外)以及声明应用程序期望获得的各种权限。

但manifest文件的主要功能仍然是向Android声明应用程序的组件 。例如,Activity可以这样声明:

<?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的 Activity子类 。Icon和label属性指向了展示给用户的此Activity的图标和标签资源文件。

其它组件也以类似的方法声明——<service>元素用于声明服务,<receiver>元素用于声明 广播接收器,而<provider>元素用于声明内容提供者。Manifest文件中未进行声明的Activity、服务以及内容提供者将不 为系统所见,从而也就不会被运行。然而,广播接收器既可以在manifest文件中声明,也可以在代码中进行动态的创建,并以调用 Context.registerReceiver()方式注册至系统。

欲更多了解如何为应用程序构建manifest文件,请参阅AndroidManifest.xml文件一节。

1.1.4 Intent Filter(过滤器)

Intent对象可以显式指定目标组件。如果指定目标组件,Android会找到这个组件(根据manifest文件中的声明)并激活它。但如果 Intent没有指定目标组件,Android就必须找到最合适的组件来响应Intent。这个过程是通过比较Intent对象和所有潜在目标对象的 Intent Filter实现。组件的Intent Filter会通知Android它所能处理的Intent类型 。和组件的其他重要信息一样,Intent Filter也是在manifest文件声明。下面是上面示例的一个扩展,向Activity添加了两个Intent Filter声明:

<?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:type=”image/jpeg” />

<category android:name=”android.intent.category.DEFAULT” />

</intent-filter>

</activity>

. . .

</application>

</manifest>

示例中的第一个过滤器 ——行为“android.intent.action.MAIN”和类别“android.intent.category.LAUNCHER”的组合最常见的 。它标明这个Activity将在应用程序启动项中显示,即用户在设备上看到的可以启动的应用程序列表。 换句话说,这个Activity是应用程序的入口,是用户选择该应用程序后所看到的第一个Activity。

第二个过滤器声明了这个Activity可以在特定类型的数据上执行的操作。

组件可以有任意数量的Intent Filter,每个声明一系列不同的功能。 如果没有任何过滤器,则只能被显式声明了目标组件名称的Intent激活。

对于在代码中创建并注册的广播接收器,Intent Filter直接实例化为IntentFilter对象。所有其它的过滤器都在manifest文件设定。

关于Intent Filter的其他信息,请参阅:Intent和Intent Filter。

转自:http://blog.csdn.net/laiyiling/archive/2009/08/17/4454323.aspx

PS:

插一个S3C6410 Android Mediaplayer的mainfest示例:

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="samsung.media.Mediaplayer">

    <application android:icon="@drawable/icon" android:label="@string/app_name">

        <activity android:name=".Mediaplayer" android:label="@string/app_name">

----------------------------------------------     

      <intent-filter>

                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter> -------------------------------------------------

                </activity>

        <activity android:name="VideoPlayer"></activity>

</application>

</manifest>

继续阅读