原文:Android Application (Java 部分)启动过程
调用 ActivityThread.main() ,具体过程如下:
1, 如果支持 Dalvik 的 sampling profiler, 则绑定本线程族到 SamplingProfiler 实例,并启动;
2, 为 native 进程进行更新参数 ArgV0;
3, 准备主 Looper: 创建一个新的 Looper 实例,并关联到ActivityThread 的静态 sThreadLocal, 和 Looper 的静态 mMainLooper;
4, 创建 Handler 实例 sMainThreadHandler。
问题:
1, 什么是 sampling profiler?
2, 什么是 Looper?
指的是线程的消息循环。与消息循环交互一般都是通过 Hanlder 完成的。
从代码上看,一个 Looper 的 loop 就是一个 while 死循环。
3, 什么是 Handler?
一个 Handler 与一个线程(指创建该 Handler 的线程)和一个消息队列绑定。有两个作用,暂不处理,放入队列中,自己不处理,让别人处理。
继续:
5, 创建一个 ActivityThread 实例 thread。(同时创建ApplicationThead实例:mAppThread)
6, 把thread 以非系统线程的方式绑定。
1) 关联到 ActivityThread 的 静态 sThreadLocal。
2) 创建并加入ViewRoot 的 addFirstDrawHandler。
3) 设置 DdmHandleAppName
4) 关联 RuntimeInit ApplicationObject (mAppThread)
5) 从 native 获取IActivityManager: mgr。
6) 关联 mAppThread 到 mgr.
7) 创建并加入ViewRoot 的 addConfigCallback。
7, 开始 loop。
总结:
1,无论 ActivityThread 和 ApplicationThread, 都不是真正的线程,它们大部分代码是运行在java 的 主线程中, Thread[main, 5, main]
2, ApplicationThread 是一个Binder,
要避免名字上的误导。