四大组件的工作过程(Android开发艺术探索读书笔记)

Activity的工作过程

注意:探究源代码别处于“只见树木,不见森林”的状态。

Activity.startActivity()---->
Activity.startActivityForResult()---->
mInstrumentation.execStartActivity()---->
ActivityManager.getDefault().startActivity()

ActivityManager.getDefault().startActivity()分析:

ActivityManagerService(AMS)继承自ActivityManagerNative,而ActivityManagerNative继承自Binder并实现了IActivityManager这个Binder接口,因此AMS 也是一个Binder,它是IActivityManager的具体实现,这里getDefault会返回一个单例的AMS对象,所启动流程转到AMS.startActivity();

我们先回过头看mInstrumentation的execStartActivity方法,其中有一行代码:checkStartActivityResult(result,indent),作用就是检查启动Activity的结果。当无法正确地启动一个Activity时,这个方法会抛出异常,其中有我们熟悉的“Unable to find explicit class;have you declared this activity in your AndroidManifest.xml?”

AMS.startActivity()---->
AMS.startActivityAsUser()---->
ActivityStackSupervisor.startActivityMayWait()---->
ActivityStackSupervisor.startActivityLocked()---->
ActivityStackSupervisor.startActivityUncheckedLocked()---->
ActivityStack.resumeTopActivityLocked()---->
ActivityStack.resumeTopActivityInnerLocked()---->
ActivityStackSupervisor.startSpecificActivityLocked()---->
ActivityStackSupervisor.realStartActivityLocked()

这里写图片描述

ActivityStackSupervisor.realStartActivityLocked()---->
app.Thread.scheduleLaunchActivity()

app.Thread是一个IApplicationThread类型,IApplicationThread声明了很多启动、停止Activity的接口,此外还包含了启动和停止Service的接口。

看一下ApplicationThead的定义:

private class ApplicationThread extends ApplicationThreadNative

public abstract class ApplicationThreadNative extends Binder implements IApplicationThread

看声明可以看出,IApplicationThread的真正实现类是ApplicationThread,它是ActivityThread一个内部类。在ApplicationThreadNative内部,有一个ApplicationThreadProxy类,这个类是系统AIDL文件生成的代理类,又由于ApplicationThreadNative是一个抽象类,所以ApplicationThread成了IApplicationThread最终实现者。

绕了一大圈,Activity的恶启动过程最终回到了ApplicationThread中,ApplicationThread通过scheduleLaunchActivity方法来启动Activity。

ApplicationThread.scheduleLaunchActivity()---->
H.sendMesasge(H.LAUNCH_ACTIVITY,r)---->
ActivityThread.handleLaunchActivity()---->
ActivityThread.performeLaunchActivity()+ActivityThread.handleResumeActivity()

performLaunchActivity方法最终完成了Activity对象的创建和启动过程,并且ActivityThread通过handleResumeActivity方法来调用启动Activity的onResume这一声明生命周期方法。

performLaunchActivity这个方法主要完成如下几件事:
1.从ActivityClientRecord中获取启动的 Activity的组件信息

2.通过Instrumentation的newActivity方法使用类加载器创建Activity对象

cl.loadClass(className).newInstance()

3.通过LoadedApk的makeApplication方法来尝试创建Application对象。

如果Application已经被创建过了,那么就不会再重复创建了,这也意味着一个应用只有一个Application对象。Application对象的创建也是通过Instrumentation来完成的恶,整个过程和Activity对象创建一样,都是通过类加载器来实现的,Application创建完毕后,系统会通过Instrumentation的callApplicationOnCreate来调用Application的onCreate方法。

4.创建ContextImpl对象并通过Activity的attach方法来完成一些重要数据的初始化
ContextImpl是一个很重要的数据结构,它是Context的具体实现,Context中的大部分逻辑都是由ContextImpl来完成的。ContextImpl是通过Activity的attach方法来和Activity建立关联的,除此之外,在attach方法 中Activity还会完成Window的创建并建立自己和Window的关联,这样当Window接收到外部输入事件后就可以将事件传递给Activity。

5.调用Activity的onCreate方法
mInstrumentation.callActivityOnCreate(activity,r.state),由于Activity的onCreate已经被调用了,这也意味着Activity已经完成了整个启动过程。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值