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主要完成:
- 从ActivityClientRecord中获取待启动的Activity的组件信息
- 通过Instrumentation的newActivity方法使用类加载器创建Activity对象
- 通过LoadedApk的makeApplication方法来尝试创建新的Application对象
- 创建ContextImpl对象并通过Activity的attach方法来完成一些重要数据的初始化
- 调用Activity的onCreate()方法
9.3 Service的工作过程 / 336
9.3.1 Service的启动过程 / 336
handleCreateService主要完成
- 通过类加载器创建Service的实例
- 创建Application对象并调用onCreate()
- 创建ContextImpl并通过Service的attach方法建立联系
- 调用Service的onCreate方法并将Service对象存储到ActivityThread的一个列表中