android应用程序窗口框架学习(3)-应用程序的进程的启动过程

注意这里分析的是应用程序得到进程的启动过程,参考下面的第二篇文章,大家也可以看看第一篇文章。这里作为自己的笔记参考

http://blog.csdn.net/luoshengyang/article/details/6689748 

老罗博客-Android应用程序启动过程源代码分析

http://blog.csdn.net/luoshengyang/article/details/6747696 

老罗博客-Android应用程序进程启动过程的源代码分析


ActivityThread 类:

该类为应用程序的主线程类,所有的APK程序都有且只有一个ActivityThread类,程序的入口为该类的static main()函数,ActivityThread所在的线程即为UI线程或主线程。

ActivityThread.main()

       这个函数定义在frameworks/base/core/java/android/app/ActivityThread.java文件中:


public final class ActivityThread {  
    ......  
  
    public static final void main(String[] args) {  
        SamplingProfilerIntegration.start();  
  
        Process.setArgV0("<pre-initialized>");  
  
        Looper.prepareMainLooper();  
        if (sMainThreadHandler == null) {  
            sMainThreadHandler = new Handler();  
        }  
  
        ActivityThread thread = new ActivityThread();  
        thread.attach(false);  
  
        if (false) {  
            Looper.myLooper().setMessageLogging(new  
                LogPrinter(Log.DEBUG, "ActivityThread"));  
        }  
        Looper.loop();  
  
        if (Process.supportsProcesses()) {  
            throw new RuntimeException("Main thread loop unexpectedly exited");  
        }  
  
        thread.detach();  
        String name = (thread.mInitialApplication != null)  
            ? thread.mInitialApplication.getPackageName()  
            : "<unknown>";  
        Slog.i(TAG, "Main thread of " + name + " is now exiting");  
    }  
  
    ......  
}  

首先,ActivityThread从mian函数中开始执行,调用prepareMainLooper()为UI线程创建一个消息队列(MessageQueue)

然后从这里我们可以看出,这个函数首先会在进程中创建一个ActivityThread对象:

ActivityThread thread = newActivityThread(); 

在ActivityThread的初始化代码中会创建一个H(Handler)对象和一个Application(Binder)对象,其中Binder负责接收远程AmS的IPC调用,接收到调用后,则通过Handler把消息发送到消息队列,UI主线程会异步地从消息队列中取出消息并执行相应操作。比如start,stop,pause等。

接着然后进入消息循环中:

Looper.loop(); 

进入后就会不断的从消息队列中读取处理的消息。

       这样,我们以后就可以在这个进程中启动Activity或者Service了。



你可能感兴趣的:(源码,应用程序窗口框架)