zoukankan      html  css  js  c++  java
  • 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通过调用ActivityonNewIntent()方法来向Activity传递新的Intent
      Activity通常启动其他的Activity。如果它期望它所启动的那个Activity返回一个结果,会调用startActivityForResult()来取代startActivity()。比如说,如果启动了另外一个Activity以使用户挑选一张照片,它应该希望返回被选中的照片。结果将会被封装在一个Intent对象中,并传递给启动ActivityonActivityResult()方法。
    • 通过传递一个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消息的信息,请参阅章节IntentIntent Filter(滤过器)。

    1.1.2 关闭组件

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

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

    • 可以通过finish()方法来关闭一个ActivityActivity可以通过调用另外一个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子类。Iconlabel属性指向了展示给用户的此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的其他信息,请参阅:IntentIntent Filter

  • 相关阅读:
    左偏树
    论在Windows下远程连接Ubuntu
    ZOJ 3711 Give Me Your Hand
    SGU 495. Kids and Prizes
    POJ 2151 Check the difficulty of problems
    CodeForces 148D. Bag of mice
    HDU 3631 Shortest Path
    HDU 1869 六度分离
    HDU 2544 最短路
    HDU 3584 Cube
  • 原文地址:https://www.cnblogs.com/hehe520/p/6330079.html
Copyright © 2011-2022 走看看