Android 中四大组件运行状态分析

四大组件基本介绍

首先先对 Android 中的四大组件做个简单介绍:

  • Activity 负责 UI 元素的加载与页面之间的跳转,代表了一个页面单元。
  • Service 负责与 UI 无关的工作,如在后台执行耗时操作等。
  • ContentProvider 负责存储、共享数据,使得数据可以在多个应用之间共享。
  • Broadcast 则是在各个组件、应用之间进行通信,简化了 Android 开发中的通信问题。

四大组件运行状态

Android 的四大组件中除了 BroadcastReceiver 以外,其他三种组件都必须在 Android-Manitest 配置文件中注册,对于 BroadcastReceiver 来说,它既可以在 Android-Manifest 中注册也可以通过代码来注册。在调用方式上,Activity、Service 和 BroadcastReceiver 需要借助 Intent,而 ContentProiver 则无须借助 Intent。

Activity

Activity 是一种展示型组件,用于向用户直接地展示一个界面,并且可以接收用户的输入信息从而进行交互。Activity 是最重要的一种组件,对用户来说,Activity 就是一个 Android 应用的全部,这是因为其他三大组件对用户来说都是不可感知的。Activity 的启动由 Intent 触发,其中 Intent 可以分为显示 Intent 和隐士 Intent,显示 Intent 可以明确地指向一个 Activity 组件,隐士 Intent 则指向一个或多个目标 Activity 组件,当然也可能没有任何一个 Activity 组件可以处理这个隐士 Intent。一个 Activity 组件可以具有特定的启动模式,同一个 Activity 组件在不同的启动模式下会有不同的效果。Activity 组件是可以停止的,在实际开发中可以通过 Activity 的 finish 方法来结束一个 Activity 组件的运行。由此看来,Activity 组件的主要作用是展示一个界面并和用户交互,它扮演的是一种前台界面的角色。

Service

Service 是一种计算型组件,用于在后台执行一系列计算任务。由于 Service 组件工作在后台,因此用户无法直接感知到它的存在。Service 组件和 Activity 组件略有不同,Activity 只有一种运行模式,即 Activity 处于启动状态。但是 Service 组件却有两种状态:启动状态和绑定状态。当 Service 组件处于启动状态时,这个时候 Service 内部可以做一些后台计算,并且不需要和外界有直接的交互。尽管 Service 是用于执行后台计算的,但是它本身是运行在主线程中的,因此耗时的后台计算仍然需要在单独的线程中去完成。当 Service 组件处于绑定状态时,这个时候 Service 内部同样可以进行后台计算,但是处于这种状态时外界可以很方便地和 Service 组件进行通信。Service 组件也是可以停止的,停止一个 Service 组件稍显复杂,需要灵活采用 stopServiceunBindService 这两个方法才能完全停止一个 Service 组件。

BroadcastReceiver

BroadcastReceiver 是一种消息型组件,用于在不同的组件乃至不同的应用之间传递消息。BroadcastReceiver 同样无法被用户直接感知,因为它工作在系统内部。BroadcastReceiver 也叫广播,广播的注册有两种方式:静态注册和动态注册。静态注册是指在 AndroidManifest 配置文件中注册广播,这种广播在应用安装时会被系统解析,此种形式的广播不需要应用启动就可以收到相应的广播。动态注册广播需要通过Context.registerReceiver()来实现,并且在不需要的时候要通过Context.unRegisterReceiver()来解除广播。此种形式的广播必须要应用启动才能注册并接收广播,因为应用不启动就无法注册广播,也就无法收到相应的广播。在实际开发中通过 Context 的一系列 send 方法来发送广播,被发送的广播会被系统发送给感兴趣的广播接受者,发送和接收过程的匹配是通过广播接受者的<intent-filter>来描述的。可以发现,BroadcastReceiver 组件可以用来实现低耦合的观察者模式,观察者和被观察者之间可以没有任何耦合。由于 BroadcastReceiver 的特性,它不适合用来执行耗时的操作。BroadcastReceiver 组件一般来说不需要停止,它也没有停止的概念

ContentProvider

ContentProvider 是一种数据共享型组件,用于向其他组件乃至其他应用共享数据。和 BroadcastReceiver 一样,ContentProvider 同样无法被用户直接感知。对于一个 ContentProvider 组件来说,它的内部需要实现增删改查这四种操作,在它的内部维持着一份数据集合,这个数据集合既可以通过数据库来实现,也可以采用其他任何类型来实现,比如 ListMap。ContentProvider 对数据集合的具体实现并没有任何要求。需要注意的是,ContentProvider 内部的 insertdeleteupdatequery 方法需要处理好线程同步,因为这几个方法是在 Binder 线程池中被调用的,另外 ContentProvider 组件也不需要手动停止