开发艺术之旅 | 四大组件的工作过程

四大组件简介

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 流程图

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 通过接收处理消息在主线程中调用了四大组件的相应的创建方法

猜你喜欢

转载自blog.csdn.net/weixin_41802023/article/details/104402368
今日推荐