startActivity

通过Android源代码分析startActivity()过程(下)

痞子三分冷 提交于 2020-11-23 05:39:10
#通过Android源代码分析startActivity()过程(下) 继续分析startActivity()。 上一篇blog 讲到通过zygote进程fork出了一个新的应用进程,接下来我们需要分析这个进程启动之后的事情。 zygote进程fork出一个新的app进程后,就会调用他ActivityThread类的的main方法来启动它,所以,一个新进程的真正入口并不是我们通常所说的Application#onCreate方法,而是ActivityThread#main方法。 我们就从这个main方法开始分析: public static void main(String[] args) { //1. 为本进程准备好UI线程的消息队列和Looper Looper.prepareMainLooper(); //2.把ApplicationThread跟远程AMS关联起来 ActivityThread thread = new ActivityThread(); thread.attach(false); if (sMainThreadHandler == null) { sMainThreadHandler = thread.getHandler(); } //3. 开始执行消息循环 Looper.loop(); throw new RuntimeException("Main

通过Android源代码分析startActivity()过程(上)

廉价感情. 提交于 2020-10-29 17:04:23
#通过Android源代码分析startActivity()过程(上) 一 概述 在Android中,我们去调用startActivit()来启动一个Activity,经过复杂的代码跳转后,最终是由ActivityManagerService(简称ams,下同)来真正的打开一个应用的Activity的。 由于ams运行在system_server进程中,所以普通的app进程与ams进行通信,就涉及到跨进程通信的问题,这种情况下的跨进程,Android采用的Binder机制,通过AIDL来实现,如果对这个不了解,可以参考 前一篇关于AIDL的博文 ,如果你对这个了解了,下面我们将要分析到的代码逻辑,你会觉得似曾相识。 在startActivit()的整个过程,可以分为两部分来理解: app进程去调用位于system_server进程中的ams startActivit()会调用ams去启动app的入口Activity,如果ams发现这个app进程未启动,则会由于zygote进程fork出一个新的进程出来,然后在启动这个 app进程的ActivityThread main()方法。 位于system_server进程中的ams去调用app进程 新启动的app进程,在其ActivityThread main()方法种,会将自己和 system_server进程中的ams绑定在一起