Android进阶(9)| 四大组件的工作过程

本节目录

一.Activity的工作过程

1.Activity的创建流程

1)startActivity()有好几种重载方式,但是他们最终都会去调用startActivityForResule()方法。
2)接着在startActivityForResule()内部中会去调用execStartActivity()方法。
3)在execStartActivity()方法中会去调用ActivityManagerNative.getDefault().startActivity()方法去真正实现Activity的启动。
4)由于ActivityManagerService继承自ActivityManagerNative,而ActivityManagerNative又继承自Binder并且实现了IActivityManager这个Binder接口,因此可以说:Activity的启动过程又转移到了ActivityManagerService(AMS)中。
5)在AMS的startActivity()方法中会去调用ActivityStackSupervisor.startActivityMayWait()方法。
6)在startActivityMayWait()方法中又会去调用startActivityLocked()方法。
7)startActivityLocked()方法又会调用startActivityUnCheckedLocked()方法。
8)接着startActivityUnCheckedLocked()方法又会去调用ActivityStack的resumeTopActivities-Locked()方法。这时启动过程已经由ActivityStackSupervisor转移到了ActivityStack中。
9)resumeTopActivities-Locked()方法的内部又会去调用resumeTopActivityInnerLocked()方法。
10)resumeTopActivityInnerLocked()方法内部去调用ActivityStackSupervisor类中的startSpecificActivityLocked()方法。此时启动过程又从ActivityStack转移到了ActivityStackSupervisor中。
11)startSpecificActivityLocked()方法会去调用realStartActivityLocked()方法。
12)realStartActivityLocked()方法中会使用到一个类——IApplicationThread。IApplicationThread是一个Binder类型的接口,而从它内部的声明可以看出IApplicationThread的实现者完成了大量的Activity以及Service启动和停止相关的功能。
13)ApplicationThread继承了ApplicationThreadNative,而ApplicationThreadNative继承了Binder并且继承了IApplicationThread,因此ApplicationThread就是IApplicationThread的最终的实现者。
14)在ApplicationThread中使用scheduleLaunchActivity()方法来启动Activity。
15)scheduleLaunchActivity()的内部实现就是发送一个启动Activity的消息交由Handler来处理,这个Handler叫做H。
16)Handler接受到消息之后,会调用ActivityThread的handleLaunchActivity()方法来进行实现。
17)最后的最后,在scheduleLaunchActivity()中来调用performLaunchActivity()方法来最终完成了Activity对象的创建和启动过程。

2.浅析performLaunchActivity()

performLaunchActivity()这个方法主要完成了如下几件事:

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

二.Service的工作过程

1.Service的启动过程

1)Service首先会从ContextWrapper的startService()方法开始。
2)在ContextWrapper的startService()方法中会去调用ContextImpl中的startService()方法。
3)在ContextImpl中的startService()方法中会接着调用startServiceCommon()方法。
4)在startServiceCommon()方法中会去通过ActivityManagerNative.getDefault(实际上就是一个AMS)方法去启动该startService()方法。
5)在AMS的startServiceCommon()方法中会通过mServices这个对象来完成Service后续的启动过程,并会对该对象使用startServiceLocked()方法,而在该方法的尾部会调用startServiceInnerLocked()方法。
6)在startServiceInnerLocked()中并没有完成具体的启动工作,而是把后续的工作交给了bringUpServiceLocked()方法来处理,而在bringUpServiceLocked()方法中又会去调用realStartServiceLocked()方法。
7)在realStartServiceLocked()中会通过app.thread的scheduleCreateService()方法创建Service并且调用其onCreate()方法。
8)在scheduleCreateService()方法中就是和Activity类似,即发送消息给Handler H来完成的。H会接受这个消息并且通过ActivityThread的handleCreateService()方法来完成Service的最终启动。

2.浅析handleCreateService()

handleCreateService()这个方法主要完成了以下几件事:

  • 首先通过类加载器创建Service的实例
  • 然后创建Application对象并且调用其onCreate()方法,不过Application的创建过程只有一次
  • 接着创建ConTextImpl对象并通过Service的attach()方法建立二者之间的关系
  • 最后会调用Service的onCreate()方法并将Service对象存储到ActivityThread中的一个列表中,该列表的定义如下:
final ArrayMap mServices = new ArrayMap();

3.Service的绑定过程

1)Service的绑定过程也是先从ContextWrapper的bindService()方法开始的。
2)bindService()方法接着会回调自己的bindServiceConnand()方法。
3)在bindService()方法中会去调用AMS的bindService()方法来完成具体的绑定过程。
4)在AMS的bindService()方法中会去调用ActiveServices的bindServiceLocked()方法,而bindServiceLocked()会再去调用bringUpServiceLocked()方法,接着bringUpServiceLocked()又会去调用realStartServiceLocked()方法,该方法的执行逻辑就是通过ApplicationThread来完成Service实例的创建并执行其onCreate()方法。
5)接着会去调用ActiveServices的requestServiceBindingLocked()方法。
6)requestServiceBindingLocked()方法中会去调用app.thread的scheduleBindService()方法,在该方法中就会向H发送一条绑定的消息。
7)在ActivityThread的handleBindService()方法中会来处理之前发送的消息,之后就会调用Service的onBind()方法。
9)当Service的onBind()方法执行以后,系统还需要告知客户端已经成功连接Service,这个过程就会由AMS的publishService()方法来实现。
10)publishService()方法会将具体的工作交给ActiveServices类型的mServices对象来处理,接着会去调用InnerConnection的connected()方法。
11)InnerConnection的connected()方法又会去调用ServiceDispatcher的connected()方法。
12)ServiceDispatcher的connected()方法又会去调用RunConnection()方法。
13)RunConnection()方法中又会去调用其内部的run()方法,在run的内部会去调用ServiceDispatcher的doConnected()方法,由于ServiceDispatcher()内部保存了客户端的ServiceConnection()对象,因此它可以很方便的调用ServiceConnection对象的onServiceConnected()方法。至此,Service的绑定就彻底完成了!

三.BroadcastReceiver的工作过程

1.广播的注册过程

1.静态注册

广播的静态注册是在AndroidManifest中完成的,由静态注册的应用会在安装时由系统自动完成注册,具体来说是由PMS来完成整个注册过程的。

2.动态注册

1)先是从Context的registerReceiver()方法开始的。
2)在registerReceiver()中会将注册的过程交给ContextImpl的registerReceiver()方法来完成。
3)在ContextImpl的registerReceiver()方法中会去调用自己的registerReceiverInternal()方法。
4)registerReceiverInternal()方法中会调用到AMS的registerReceiver()方法,在该方法中会把远程的InnerReceiver对象以及InterFilter对象存储起来,这样整个广播的注册过程就完成了。

2.广播的发送和接收过程

1)从ContextWrapper的sendBroadcast()方法开始。
2)在ContextWrapper的sendBroadcast()方法会将过程交由给ContextImpl的sendBroadcast()方法来进行。
3)在ContextImpl中会向AMS发起一个异步请求用于发送广播,该过程会通过broadcastIntent()方法来进行。
4)在broadcastIntent()方法中会去调用broadcastIntentLocked()方法,在该方法的内部会根据intent-filter查找出匹配的广播接收者并且经过一系列的条件过滤,最终会将满足条件的广播接收者添加到BroadcastQueue中。
5)在BroadcastQueue中会通过scheduleBroadcastLocked()方法来实现广播的发送过程,在该方法中会发送一个BROADCAST-INTENT-MSG类型的消息,而BroadcastQueue收到消息后会调用processNextBroadcast()方法。
6)在processNextBroadcast()方法中会调用deliverToRegisteredReceiverLocked()方法,该方法负责将一个广播发送给一个特定的接受者,它内部会调用performReceiverLocked()来完成具体的发送过程。
7)在performReceiverLocked()中会去调用scheduleRegisterReceiver()方法,在该方法的内部会通过performReceiver()来实现广播的接收。
8)performReceiver()内部会创建一个Args对象并且通过mActivityThread的post方法来执行Args中的逻辑。
9)在Args中的run()方法中就会去执行BroadcastReceiver的onReceive()方法,到这里应用已经接受到广播了。

四.ContentProvider的工作过程

1.ContentProvider的启动过程

访问ContentProvider需要通过ContentResolver,ContentResolver是一个抽象类,而通过getContentResolver()方法获取到的实际上时ApplicationContentResolver对象,该对象继承了ContentResolver并且实现了ContentResolver中的抽象方法。当ContentProvider所在的进程未启动时,第一次访问它时就会触发ContentProvider的创建。而ContentProvider的四个方法都可以触发ContentProvider的启动过程。这里选择query()方法为例。启动过程如下
1)在ContentProvider的query()方法中,首先会调用ApplicationContentResolver的acquireProvider()方法获取到IContentProvider对象。
2)在ApplicationContentResolver的acquireProvider()方法方法中并没有处理任何的逻辑,而是直接调用了ActivityThread的acquireProvider()方法。
3)在acquireProvider()方法中会调用AMS的getContentProvider()方法来获取到目标ContentProvider。
4)接着就会在AMS中使用startProgressLocked()方法来启动ContentProvider所在的进程,新进程启动后其入口方法为ActivityThread的main()方法。
5)在main()方法会通过attach()方法将ApplicationThread对象通过AMS的attachApplication()方法跨进程传递给AMS。
5)在attachApplication()方法中又会去调用attachApplicationLocked()方法,在attachApplicationLocked()中又调用ApplicationThread的bindApplication。
6)在bindApplication中会发送一个BIND_APPLICATION类型的消息给一个Handler对象,它收到消息后会调用ActivityThread的handleBindApplication()方法,handleBindApplication()方法就时最终完成Application的创建以及ContentProvider的创建。

2.浅析handleBindApplication()

handleBindApplication()方法是完成ContentProvider创建的最终方法,在该方法中主要会完成以下几件事:

  • 创建ContextImpl和Instrumentation
  • 创建Application对象
  • 启动当前进程的ContentProvider并调用onCreate()方法
  • 调用Application的onCreate()方法

你可能感兴趣的:(Android进阶(9)| 四大组件的工作过程)