09 四大组件的工作过程

2019/03/06 posted in  Android开发艺术探索

9.1 四大组件的运行状态 / 316

1、Activity(展示型组件)

Activity的主要作用是展示一个界面并和用户交互,它扮演的是一种前台界面的角色。

  • 需要借助Intent启动。有显示Intent和隐式Intent。隐式Intent指向一个或多个目标Activity组件,当然也可能没有任何一个Activity组件可以处理这个隐式Intent。
  • 可以具有特定的启动模式,比如singleTop、singleTask等。
  • 通过Activity的finish方法来结束一个Activity组件的运行。

2、Service(计算型组件)

Service用于在后台执行一系列计算任务。

  • 启动状态:做后台计算,不需要和外界有直接的交互。
  • 绑定状态:这个时候Service内部同样可以进行后台计算,但是处于这种状态时外界可以很方便的和Service组件进行通信。
  • 尽管Service组件用于执行后台计算,但它本身是运行在主线程中的,因此耗时的后台计算仍然需要在单独的线程中去完成。
  • 灵活采用stopService和unBindService这两个方法才能完全停止一个Service组件。

3、BroadcastReceiver(消息型组件)

BroadcastReceiver用于在不同的组件乃至不同的应用之间传递消息。

  • 可以在AndroidManifest中静态注册
  • 动态注册,Context.registerReceiver()和 Context.unRegisterReceiver()
  • 通过Context的一系列send方法来发送广播,发送和接收过程的匹配是通过广播接收者的来描述的。
  • 不适合用来执行耗时操作。
  • BroadcastReceiver组件一般来说不需要停止,它也没有停止的概念。

4、ContentProvider(数据共享型组件)

ContentProvider用于向其他组件乃至其他应用共享数据。

  • 它的内部需要实现增删查改这四种操作,在它的内部维持着一份数据集合,这个数据集合既可以通过数据库来实现,也可以采用其他任何类型来实现,比如List和Map,ContentProvider对数据集合的具体实现并没有任何要求。
  • ContentProvider内部的insert、deleted、update和query方法需要处理好线程同步,因为这几个方法是在Binder线程池中被调用的。
  • ContentProvider无需手动停止。

9.2 Activity的工作过程 / 318

performLaunchActivity主要完成:

  1. 从ActivityClientRecord中获取待启动的Activity的组件信息
  2. 通过Instrumentation的newActivity方法使用类加载器创建Activity对象
  3. 通过LoadedApk的makeApplication方法来尝试创建新的Application对象
  4. 创建ContextImpl对象并通过Activity的attach方法来完成一些重要数据的初始化
  5. 调用Activity的onCreate()方法

9.3 Service的工作过程 / 336

9.3.1 Service的启动过程 / 336

handleCreateService主要完成

  1. 通过类加载器创建Service的实例
  2. 创建Application对象并调用onCreate()
  3. 创建ContextImpl并通过Service的attach方法建立联系
  4. 调用Service的onCreate方法并将Service对象存储到ActivityThread的一个列表中

9.3.2 Service的绑定过程 / 344

9.4 BroadcastReceiver的工作过程 / 352

9.4.1 广播的注册过程 / 353

9.4.2 广播的发送和接收过程 / 356

9.5 ContentProvider的工作过程 / 362