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 启动。
- Activity的启动流程
- activity 启动流程分析
- Activity启动流程
- activity启动流程
- Activity的启动流程
- Activity的启动流程
- activity 启动流程分析
- Activity启动流程
- Activity 视图启动流程
- Activity的启动流程
- Activity启动流程
- activity的启动流程
- Activity启动流程
- Activity启动流程阅读
- Activity的启动流程
- Activity的启动流程
- Activity的启动流程
- Activity的启动流程
- 327. Count of Range Sum 满足某个范围数内的区间个数
- 多渠道打包
- Android杂谈(11)更换Androidstudio缓存配置目录,减少c盘压力
- Oracle共通操作
- Java四种线程池的使用
- Activity 启动流程
- Ultraedit去除带有关键字的一行
- 等待/通知机制:
- ListView+网络下载+xml解析
- Android Studio 环境搭建以及入门详细介绍(装载)
- linux先安装svn server
- 系统架构师要点总结(一) —— 软件架构设计
- 关闭windows 2003 开机事件报错
- android Conversion to Dalvik format failed with error 1