Activity 启动流程

来源:互联网 发布:维稳大数据 编辑:程序博客网 时间:2024/06/18 17:58

Activity的启动;


Intent intent = new Intent(this,A.class);

startActivity(intent);


startActivity方法有好几种加载方式 但是最终都会调用startActivityForResult方法




注意; mMainThread.getApplication 的类型是 ApplicationThread 类型。

ApplicationThread 是ActivityThread 一个内部类。


ApplicationThread 与ActivityThread 在Activity 启动过程中发挥着很重要的作用。







通过以上代码可以看出 Activity的真正启动是通过  ActivityManagerNative.getDefault().startActivity(….) 方法启动,



 ActivityManagerService   extends  ActivityManagerNative;


ActivityManagerNative  extends  Binder  implements IActivityManager


而 ActivityManagerNative.getDefault() 其实是一个IActivityManager 类型的Binder 因此具体的 startActivity的实现是在 ActivityManagerService中实现的。







而ActivityManagerService 这个Binder对象 是一个单例模式  


第一次调用get时会调用create方法创建改对象,之后则返回之前创建的对象。


通过上述分析 Activity的启动是通过ActivityManagerNative.getDefault().start(…) 启动,进而转化为 ActivityManagerService 中。








可以看出 startActivity 的启动流程又转移到了 ActivitySupervisor中的startActivityMayWait中,

 

接着 startActivityMayWait中调用了 StartActivityLocked ,startActivityLocked 紧接着调用了  startActivityUncheckedLocked  ,然后 startActivityUnCheckLocked 调用了 


ActivityStack 类中的resumeTopActivitiesLocked 方法





在 resumeTopActivityLocked方法中 调用了 resumeTopActivityInnerLocked方法, 而  resumeTopActivityInnerLocked方法中 又调用了


ActivityStackSupervisor 中的 startSpecificActivityLocked方法。







在 startSpecificActivityLocked 方法中又调用了 realStartActivityLocked方法


在ActivityStartSupervisor以及 ActivityStack 中 的调用流程 






在 realStartActivityLocked 中又调用了scheduleaunchActivity 方法


改方法 :





而 app.thread   的类型为  IApplicationThread  改接口中主要是实现了大量的Activity以及service 启动停止相关的功能





那么 IApplicationThread 接口的实现是什么呢?


答案就是ActivityThread 的内部类ApplicationThread 中实现了IApplicationThread



可以看出 ApplicationThread 实现了 ApplicationThreadNative  而 ApplicationThreadNative 继承 Binder 同时实现了 IApplicationThread 



绕了一圈 可以看出 activity的启动最终还是需要 ApplicationThread 来实现。


在ApplicationThread 中 通过scheduleLaunchActivity 方式实现。





而 内部的实现很简单  就是发送一个启动Activity的Handle 来解决


接着 看一些 接受 消息的 Handler  H



从 H类中可以看出  activity的启动 是通过handleLaunchActivity 来实现的。





从以上代码可以看出  performLaunchActivity 方法 最终完成 Activity 对象的创建和 启动


performLaunchActivity 的主要作用


1:从ActivityClientRecord中 获取待启动的Activity组件信息




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



3:通过LoadedApk的makeApplication 方法去尝试创建Application







通过上述代码可以看出


如果Application已经被创建了那么就不会再去创建,这样就保证了一个应用只有一个Application


4: 创建 ContextImpl 对象并通过Activity的Attach方法去完成一些重要数据的初始化




5: 调用Activity的onCreate 方法。





至此  Activity 启动。















1 0