• Android开发之旅:应用程序基础及组件(续)


    ——成功属于耐得住寂寞的人,你离成功又近了一步了。

    引言

    上篇Android开发之旅:应用程序基础及组件介绍了应用程序的基础知识及Android的四个组件,本篇将介绍如何激活组关闭组件等。本文的主题如下:

    • 1、激活组件:意图(Intents)
      • 1.1、活动(Activity)组件的激活
      • 1.2、服务(Service)组件的激活
      • 1.3、广播接收者(Broadcast receiver)组件的激活
    • 2、关闭组件
    • 3、清单文件
    • 4、Intent过滤器

    1、激活组件:意图(Intents)

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

    对于每种组件来说,激活的方法是不同的。下面将分别介绍活动、服务、广播接收者组件的激活方法。

    1.1、活动(Activity)组件的激活

    通过传递一个Intent对象至Context.startActivity()Activity.startActivityForResult()以载入(或指定新工作给)一个活动。相应的活动可以看到初始的意图,这个意图通过getIntent() 方法来查看激活活动。Android调用活动的onNewIntent()方法传递任何后续的意图。

    一个活动经常启动了下一个。如果它期望它所启动的那个活动返回一个结果,它会调用startActivityForResult()而不是startActivity()。例如,如果它启动了一个活动让用户挑选一张照片,它可能会返回被选中的照片。结果以一个Intent对象传递调用活动的onActivityResult() 方法。

    1.2、服务(Service)组件的激活

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

    与此类似,一个Intent可以传递给Context.bindService()以在调用的组件和目标服务之间建立持续的连接。这个服务会在调用onBind() 方法中接受这个Intent对象(如果服务尚未启动,bindService()会先启动它)。例如,一个活动可以连接至前面讲到的音乐播放服务,并提供给用户一个可操作的(用户界面)以对播放进行控制。这个活动可以调用bindService()来建立连接,然后调用服务中定义的对象来控制播放。

    1.3、广播接收者(Broadcast receiver)组件的激活

    应用程序可以通过将Intent对象传递给

    • Context.sendBroadcast()
    • Context.sendOrderedBroadcast()
    • Context.sendStickyBroadcast()

    及其它类似方法来产生一个广播。Android会通过onReceive()方法将intent传递给所有对此广播有兴趣的广播接收者。

    2、关闭组件

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

    而活动则不同,它提供了用户界面。与用户进行会话,所以只要会话依然持续,哪怕对话进程空闲,它都会一直保持激活状态。与此相似,服务也会在很长一段时间内保持运行。所以Android提供方法有序地关闭活动和服务。

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

    当组件不再被使用的时候或者Android必须要为更多活跃的组件回收内存时,组件也可能会被系统关闭。

    3、清单(manifest)文件

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

    这个清单文件是XML结构的文件,且所有的Android应用程序都把它叫做AndroidManifest.xml。为声明一个应用程序组件,它还会做很多额外工作,比如指明应用程序所需链接到的库的名称(除了默认的Android库之外)以及声明应用程序期望获得的各种权限。

    但清单文件的主要功能仍然是向Android声明应用程序的组件。举例说明,一个活动可以如下声明:

    AndroidManifest.xml

    <activity>元素的name属性指定了实现了这个活动的Activity类的子类,iconlabel属性指向了包含展示给用户的此活动的图标和标签的资源文件。

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

    4、Intent过滤器

    Intent对象可以显式地指定目标组件。如果进行了这种指定,Android会找到这个组件(依据清单文件中的声明)并激活它。但如果Intent没有进行显式的指定,Android就必须为它找到对于intent来说最合适的组件。这个过程是通过比较Intent对象和所有可能对象的intent过滤器完成的。组件的intent过滤器会告知Android它所能处理的intent类型。如同其它关于组件的必要信息一样,它们在清单文件中进行声明的。这里是上面示例的一个扩展,其中加入了针对活动的两个intent过滤器声明:

    AndroidManifest.xml

    示例中的第一个过滤器——action:“android.intent.action.MAIN”和category:“android.intent.category.LAUNCHER”的组合,是常见的。它标记这个活动显示在应用程序启动器中,用户在设备上看到的可启动的应用程序列表。换句话说,这个活动是应用程序的入口,是用户选择运行这个应用程序后所见到的第一个活动。第二个过滤器声明了这个活动针对特定类型的数据。

    一个组件可以拥有任意数量的intent过滤器,每个声明一系列不同的能力。如果它没有包含任何过滤器,它将只能被显式声明了目标组件名称的意图激活。

    对于广播接收者,它在代码中创建并注册intent过滤器,直接作为IntentFilter的对象实例化。其它过滤器则在清单文件中设置。

    如果您现在对这些概念还没有完全理解,没关系这里我仅是让大家有个印象,知道这些概念或术语的存在,知道他们大概是做什么的。后面我还将陆续更详细地到这些东西并结合一些实例,到时候您就会清楚地知道这些东西。

  • 相关阅读:
    Leetcode 694. 不同岛屿的数量 中等 回溯 岛屿问题
    集成电路设计流程
    Leetcode 44. 通配符匹配 困难 动态规划 精选 TOP 面试题
    Leetcode 13. 罗马数字转整数 简单 字符串
    Leetcode 36. 有效的数独 中等 数组遍历 精选 TOP 面试题
    windows 不是真正的多用户OS,linux才是
    java AWT弹球游戏
    java AWT 图片查看器
    java AWT 简易绘图
    java Swing 进度条
  • 原文地址:https://www.cnblogs.com/skynet/p/1714022.html
Copyright © 2020-2023  润新知