Chrisの梳羽之礁

A look of quick intelligence and soft refinement
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

[转] Android Application (Java 部分)启动过程

Posted on 2012-06-05 11:15  Chrisfang6  阅读(1125)  评论(0编辑  收藏  举报

原文: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,
要避免名字上的误导。