6
每次看到被人写的activity的启动过程总觉得不适合自己,有的深入代码无法自拔,有的长篇累牍,不知所云。
首先我们的Android 是基于Linux 的,在Linux中,所有的进程都是由init进程直接回间接fork出来的,zygote也不例外,当我们手机开机的时候,Linux的内核加载完成之后就会启动一个叫init进程。之后会fork出来一个zygote进程,我们的应用都是通过这个进程fork出来的子进程。之后zygote进行一些操作,并fork出另一个很重要的进程systemServer进程,当这个进程开始执行是,会在其内部初始化AMS,PMS,WMS等等,这样系统的服务就已经全部创建完成了,之后系统加载我们的Launcher程序来完成系统界面的加载和显示。
当我们点击我们的应用时,Launch就会把我们的应用启动,它也是一个Activity,他启动我们应用的方式也是startActivity,startActivity的本质是调用startActivityForResult,紧接着执行Instrumentation的execcStartActivity方法。在这个方法中,会调用ActivityManagerNative.getDefault的startActivity来完成,这个对象其实是通过Ams来实现的,这个方法会返回AMS的远程接口ams的代理。我们知道AMS是在systemServer进程内的,这个进程跟我们的APP,跟zygote都是分属在不同的进程的,他们之间通过Binder和Socket相连,
这个代理利用Binder对象,调用transact(),把所用需要的参数封装成Parcel对象,像Ams进行数据传输。这样在Ams中就进行了大量的具体操作,比如处理的栈的位置之类的数据,之后通过applicationThread在服务端的代理对象,通过binder驱动传递数据给applicationthread,这个aidl中定义了大量启动或者停止activity的接口。这样启动activity的方法最终又回到了ApplicationThread中,最终会执行到ApplicationThread的scheduleLaunchActivity方法来启动Activity,scheduleLaunchActivity会通过Handler来发送创建Activity的消息给主线程,也就是ActivityThread,而ActivityThread在接收到这个创建消息之后会调用他自己的handleLaunchActivity方法,这个方法会执行performLaunchActivity方法,在performLaunchActivity方法里面就会通过Instrumentation通过反射来创建一个Activity对象出来了,在创建完Activity之后就会调用Instrumentation的callActivityOnCreate方法来启动Activity,callActivityOnCreate实际上执行的是Activity的onCreate方法,进行一些必要的初始化操作;
Activity的工作过程
最新推荐文章于 2020-06-18 21:22:37 发布