开发艺术之旅 | 四大组件的工作过程
四大组件简介
Activity
- 展示型组件,主要负责和用户交互,扮演前台角色
- 有四种启动模式,可以同显示Intent和隐式Intent启动 详见 开发艺术之旅 | Activity 生命周期和启动模式
Service
- 计算类组件,处于后台服务(不可见)
- 两种启动方法:启动和绑定
BroadcastReceiver
- 消息类组件,用于在不同组件乃至不同应用间的通信
- 不需要启动,但是需要注册:静态注册和动态注册,静态注册应用不需要启动也能收到广播
- 一般不需要停止,没有停止的概念,但是动态注册的广播需要解除注册
ContentProvider
- 数据共享类型组件,向其他组件或者应用提供数据
- ContentProvider 的增删查改需要处理好线程听不,因为是在Binder的线程池中被调用的
Activity的工作过程
从最常使用的StartActivity方法开始,流程过程如下:
最后调用到app.thread.scheduleLaunchActivity,而app.thread是一个IApplication类型的IInterface接口,其之后关系图如下:
在这个方法里,向一个Handler发送了一个消息,调用performLaunchActivity方法,在这方法主要做了五件事情:
- 从ActivityClientRecord获取待启动的Activity信息
- 通过Instrumentation的newActivity方法使用类加载器创建Activity对象
- 通过LoadedApk的makeApplication方法尝试创建Application对象(只会创建一次)(也是在Instrumentation中创建)
- 创建ContextImpl 对象并通过Activity的attach方法完成一些重要数据的初始化
- 调用Activity的onCreate方法
小结:
- AMS、ApplicationThread 是Binder对象;ApplicationThread 实现了IApplicationThread接口,这个接口包含大量的Activity和Service 启动/停止的相关功能
- Activity对象和Application对象都是通过Instrumentation来创建
- 从Activity的startActivity开始,到Instrumentation的execStartActivity,再到AMS的startActivity方法,在AMS中会在ActivityStackSupervisor 和ActivityStack中来回调用方法,最后会回到ApplicationThread中,通过一个Handler发送消息启动一个Activity
- Handler会调用performLaunchActivity()方法,最终启动一个Activity;具体操作如图;
- 最后在Instrumentation会检查启动Activity的结果
Service的工作过程
和Activity类似,Service的启动也是通过app.thread(ApplicationThread)、Handler等完成创建,但是同时有个ActiveService辅助AMS管理Service。
启动过程
绑定过程
BroadcastReceiver的工作过程
BroadcastReceiver的工作流程主要有三部分
- 注册
- 发送
- 接收
小结:
- 动态注册广播最终会交给AMS,并把远程InnerReceiver( IIntentReciverBinder接口的实现类 )对象和远程IntentFilter保存起来,完成注册
- 最终在ReceiverDispatcher .performReceive ()里回调了Receiver 的onReceive(),使得广播得以接收并处理。
ContentProvider
- query 流程图
小结:
- ContentProvider的multiprocess属性:ContentProvider是否是单例,一般用单例。
- 当ContentProvider所在的进程未启动时,会启动所在进程并创建ContentProvider。ContentProvider所在的进程启动时,ContentProvider会同时被启动并被发布到AMS中
- ContentProvider 的onCreate方法是先于Application的onCreate 方法执行的
- 启动进程由AMS的startProcessLocked完成,内部主要是通过Process的start方法启动
- query等方法也是通过AMS拿到ContentProvider的Binder对象(IContentProvider),通过IPC调用相应的方法,再将结果通过Binder返回给相应的调用者
- handleBindApplication方法主要完成了Application以及ContentProvider的创建:
- 创建ContextImpl 和 Instrumentation
- 创建Application对象
- 启动当前进程的ContentProvider并调用其onCreate方法
- 调用Application的onCreate方法
小结
- 应用启动的入口是ActivityThread的main静态方法,在这里创建了ActivityThread实力和主线程消息队列
- ActivityThread的Handler H 通过接收处理消息在主线程中调用了四大组件的相应的创建方法