android的构成和工作流程图,Android进阶(9)| 四大组件的工作过程

51d7d0397ef0

本节目录

一.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()方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值