目录
- 代码流程
- 参考链接
- 延展阅读
代码流程
用户点击了桌面上的某个app图标,
从Launcher开始(Launcher也是一个app)
-
Launcher.startShortcutOrInfoActivity(View)
它这里的形参view,通过view.tag 拿到intent信息
-
Launcher.startActivitySafely(View, Intent, Object)
可以认为是个包装方法
-
Launcher.startActivity(View, Intent, Object)
这里处理用户信息(看是游客还是管理员身份),最终把传递进来的intent加上FLAG_NEW_TASK
-
Launcher.startActivityForResult
从点击桌面启动器的按钮开始,到最终把意图传递出去,到这里就是Launcher的作用了。
-
Instrument.execStartActivity
可能会问Instrumentation类的作用,ActivityThread对Activity生命周期的调用具体通过这个类实现
-
ActivityManageProxy.startActivity
Instrument类去调用AMS(AMP是AMS的代理类,真正的实现类)
这里完成了Launcher点击启动的应用的动画(通过WMS实现,不重要),完成了信息的保存
这里全部都是AMS,WMS,Instrument,binder的交互,可以发散问 binder跨进程通信的原理
AMS.startProcessLocked-----这里是Process创建新进程,由Zygote.fork出一个新进程
Zygote.fork新进程成功后,会反射invokeActivityThread的main方法,也就是整个程序的入口函数
附app启动的部分代码调用栈(源码来自API 28)
···
Process::start
ZygoteProcess::start
ZygoteProcess::startViaZygote
ZygoteProcess::openZygoteSocketIfNeeded
--ZygoteState::connect(ZygoteState是ZygoteProcess的静态内部类)
--connect方法通过LocalSocket完成通信,Zygote孵化一个新的进程
ZygoteProcess::zygoteSendArgsAndGetResult(处理新进程)
通信的接收方见zygoteSendArgsAndGetResult方法内注释
SystemZygoteInit.readArgumentList()--可是我没找到这个方法,有谁找到了告知一下,我找的是API 26的ZygoteInit类
ZygoteInit::main
--zygoteServer::registerServerSocketFromEnv
--内部创建了一个LocalServerSokcet
···
以上部分是launcher和ams的交互,以下就是真正的app入口方法,真正的起点
ActivityThread.main里最重要的方法就是新创建了一个looper并循环,内部的attach方法进行所有的初始化功能
首先进行AMS.attachApplication
-
通过AMS.bindApplication 进程绑定到该application
这里的AMS里起作用的thread实例实际是ActivityThreadProxy代理类
最后发送一个H_BIND_APPLICATION的msg给handler,通知绑定完成
-
接收到msg后
- Instrument.onCreate
- LoadApk.makeApplication
- Instrument.newApplication
- Application.attach
至此完成Application的绑定和初始化
ContentProvider.OnCreate方法会先于Application.OnCreate,后于Application.onAttach
-
接着就是ActivityThread.scheduleLaunchActivity
发送一个H_Launch_Activity的msg个handler
接收到msg后,就开始了Activity的启动流程
https://www.jianshu.com/p/a13e3a3259f3ActivityThread.handleLauchActivity---封装
ActivityThread.performLaunchActivity---重点干了以下三件事
1.Instrument.newActivity
2.Activity.attach这里完成了theme主题的设置,window的初始化,windowManager的配置
Activity、View、Window的理解一篇文章就够了
https://www.jianshu.com/p/5297e307a6883.执行activity的生命周期
Activity的onCreate方法里有setContentView,交给PhoneWindow.initDecorView,并解析xml布局
Android应用setContentView与LayoutInflater加载解析机制源码分析
https://blog.csdn.net/yanbober/article/details/45970721Activity的onStart没做啥事,此时已经可见(只是看不见具体view)
Activity的onResume,把decor加到window里,并设置可见
接着就是View的绘制相关知识了view绘制流程就看这个源码分析
https://www.jianshu.com/p/28de1361590cView的onMesure计算大小,重点关注 父布局测量规格对子view的影响,exactly和at_most两种测量模式对子view layoutParams的影响
View的OnLayout计算位置,setFrame拿左右顶底四个坐标确定位置
View的绘制,依次画背景drawBackground,画自己onDraw,画孩子dispatchDraw,画装饰onDrawScroll
-
View的事件分发,自上而下分发 ,自下而上消费
view事件分发
https://www.jianshu.com/p/66a80ff0133b
https://mp.weixin.qq.com/s/0HB719Iuz_BfGWCOIxC__A
https://mp.weixin.qq.com/s/fBeeiTgWxn6xrnTe5jVqNQ- dispatchTouchEvent默认分发,true不分发
- onInterceptTouchEvent,只有viewGroup有,true拦截
- onTouchEvent,消费事件,true消费
参考链接
application启动流程
https://www.jianshu.com/p/6885b4558ba2
https://mp.weixin.qq.com/s/6tEBj9b-Uuw7vT39infiAA
延展阅读
垂直同步16ms的问题
https://www.jianshu.com/p/02800806356c