注意这里分析的是应用程序得到进程的启动过程,参考下面的第二篇文章,大家也可以看看第一篇文章。这里作为自己的笔记参考
http://blog.youkuaiyun.com/luoshengyang/article/details/6689748
老罗博客-Android应用程序启动过程源代码分析
http://blog.youkuaiyun.com/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了。