Activity 启动过程

Activity 启动过程

启动

应用进程

启动,调用 ContextImpl 的 startActivity(); 最终调用的 startActivityForResult(); 方法

startActivityForResult 中调用 Instrumentation 的 execStartActivity();

execStartActivity 中调用 ActivityManagerNative.getDefault().startActivity();ActivityManagerNative.getDefault();方法得到的是 IActivityManager ,该类继承了 IInterface 接口,ActivityManagerNative 继承了 Binder 并实现了 IActivityManager 接口,ActivityManagerService 继承了 ActivityManagerNative,也是一个 Binder,是IActivityManager 的具体实现类。ActivityManagerNative.getDefault 方法中通过 Binder 机制得到 ActivityManagerNative 实现类 ActivityManagerService 对象的代理类 ActivityManagerProxy 的对象,在 ActivityManagerNative 中以单例的形式提供,ActivityManagerNative.getDefault() 得到的是 ActivityManagerProxy 对象,通过该对象的 startActivity 方法会远程调用系统进程 ActivityManagerService 对象的 startActivity 方法。Instrumentation 的 execStartActivity 方法中接着调用 checkStartActivityResult() 由 AMS.startActivity 方法的返回值判断 Activity 是否注册,未注册抛出异常。

IActivityManager --> ActivityManagerNative --> ActivityManagerService(实现类) (ActivityManagerProxy 客户端中的代理类)

系统进程

ActivityManagerService 的 startActivity(); 方法中调用 ActivityStackSupervisor.java 和 ActivityStack.java 两个类中的方法,最终在 ActivityStackSupervisor 类的 realStartActivityLocked 方法中调用 app.thread.scheduleLaunchActivity(); 方法。 app.thread 类型为 IApplicationThread,是一个接口,继承了 IInterface 接口,其中定义了大量启动、停止Activity 和 服务接口,即 IApplicationThread 的实现类对象完成了启动及停止 Activity 和 Service 的功能。

IApplicationThreadNative 是抽象类, 继承了Binder 并实现了 IApplicationThread 接口,即为一个 Binder,ApplicationThread 为 其具体实现类,也为一个 Binder, ApplicationThread 是 ActivityThread 中的内部类。在启动 Activity 时从客户端通过进程间通信将 ActivityThread 的代理类 ActivityThreadProxy 对象传递到了系统进程,系统进程中的 app.thread 为 ActivityThreadProxy 类的对象,通过调用 ActivityThreadProxy 对象的方法会经过进程间通信调用 ActivityThreadNative 实现类对象中的方法,也就是调用其实现类 ApplicationThread 对象中的方法,所以系统进程中调用 app.thread 的 startActivity 方法时会在应用进程中调用 ApplicationThread 类对象的 startActivity 方法。

应用进程

通过 ApplicationThead 的 scheduleLaunchActivity(); 该方法中通过ActivityThread 中的 Handler 发送 Message ,将执行线程从 Binder 线程切换到主线程, Handler 中调用 ActivityThread 的 handleLaunchActivity() 方法并从中调用 performLaunchActivity() 完成Activity对象的创建及启动,handleLaunchActivity 中再调用 handleResumeActivity 方法调用被启动Activity 的 onResume() 方法

应用进程中 Activity 的创建与启动

performLaunchActivity() 方法中,
- 第一步,从 ActivityClientRecord 中获取待启动的 Activity 的组件信息 ActivityInfo

  • 第二步,通过 Instrumentation 的 newActivity() 方法使用类加载器创建 Activity 对象
    Classloader.loadClass(String className).newInstance();

  • 第三步,通过 LoadeApk 类的 makeApplication 方法中 通过 Instrumentation 的 newApplication 方法创建 Application 对象,同样使用类加载器创建类对象,在创建 ContextImpl 对象,再将该 ContextImpl 对象与 Application 对象绑定并调用其 onCreate 方法。如果 Application 已经创建过则不会再次创建,一个应用只能有一个 Application 对象。

    • 通过 ContextImpl 的 createAppContext() 方法,创建 Application 的 ContextImpl 对象 appContext
    • ContextImpl创建之后,调用 appContext.setOuterContext(app) 方法将 ContextImpl 与 Application 绑定并完成数据初始化
    • 接着通过 Instrumentation 的 callApplicationOnCreate 方法调用 Application 的 onCreate 方法完成 Application 的启动。
  • 第四步,通过 ContextImpl 的 createActivityContext 创建 Activity 的 ContextImpl 对象,并通过 Activity 的 attach 方法与 ContextImpl 绑定并完成一些重要数据的初始化。attach 对象中,Activity 还会完成 Window 的创建并建立自己和 Window 的关联,这样当 Window 接收到外部输入事件后就可以将事件传递给 Activity。

  • 第五步,通过 Instrumentation 的 callActivityOnCreate 方法调用 Activity 的 onCreate 方法。完成启动。

Activity启动过程中的进程变化

ActivityThread 应用进程,在组件激活的过程中 ActivityThread 中的 ApplicationThread 实例的代理会传递到 AMS 进程,AMS 进程通过 ApplicationThread 的代理的方法将流程转移到应用进程
当前应用进程主线程 –> AMS 系统进程 –> 通过 app.thread 切换到主进程并通过的 Handler 转移到应用进程主线程。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值