Apk程序的运行过程

 ./frameworks/base/core/java/android/app/ActivityThread.java

public static final void main(String[] args) {
    SamplingProfilerIntegration.start();

    Process.setArgV0("<pre-initialized>");

    Looper.prepareMainLooper();

    ActivityThread thread = new ActivityThread();
    thread.attach(false);

    Looper.loop();

    if (Process.supportsProcesses()) {
        throw new RuntimeException("Main thread loop unexpectedly exited");
    }

    thread.detach();

    String name = (thread.mInitialApplication != null)
            ? thread.mInitialApplication.getPackageName()
            : "<unknown>";
    Log.i(TAG, "Main thread of " + name + " is now exiting");
}

1、ActivityThread从 main() 方法开始执行,调用 Looper.prepareMainLooper() 方法为UI线程创建一个消息队列(MessageQueue)

2、new ActivityThread() ,创建 ActivityThread 对象,在ActivityThread的初始化中创建一个 H(Handler) 对象和一个 ApplicationThread(Binder) 对象。

       final ApplicationThread mAppThread = new ApplicationThread();
       final H mH = new H();

       1)Binder负责接收远程 AmS 的 IPC 调用

       2)接收到的调用通过 Handler 把消息发送到消息队列,UI主线程异步地从消息队列中取出消息并执行相应操作,比如 start、stop、pause等。

 3、UI主线程调用 Looper.loop() 方法进入消息循环体,不断地从消息队列中读取并处理消息 

       当 ActivityThread 接收到 AmS 发送 start 某个 Activity 后,就会创建指定的 Activity 对象, Activity 又会创建 PhoneWindow 类——> DecorView 类——>创建相应的 View 或者 ViewGroup 。创建完成后,Activity 需要把创建好的界面显示到屏幕上,于是调用 WindowManager 类,后者于是创建一个 ViewRoot 对象,该对象实际上创建了 ViewRoot 类和 W 类,创建 ViewRoot 对象以后, WindowManager 再调用 WmS 提供的远程调用接口完成添加一个窗口并显示到屏幕上。

4、等待用户在程序界面上操作,KeyQ 线程不多把用户消息存储到 QueueEvent 队列中,InputDispatcherThread 线程逐个取出消息,然后调用 WmS 中的相关函数处理该消息,当 WmS 发现该消息属于客户端某个窗口时,就会调用相应的窗口 W 接口。

       W 类是一个 Binder,负责接收 WmS 的IPC调用,并把调用消息传递给 ViewRoot, ViewRoot 再把消息传递给 UI 主线程 ActivityThread,ActivityThread 解析该消息并作相应的处理,在客户端程序中,首先处理消息的是 DecorView,如果 DecorView 不想处理该消息,则可以把该消息传递给其内部包含的子 View 或者 ViewGroup ,如果还没有处理,则传递给 PhoneWindow ,最后在传递给 Activity 

posted on 2012-08-20 17:28  zyuchao  阅读(452)  评论(0编辑  收藏  举报

导航