本文主要讲解崩溃防护
1.Android应用程序源码启动基本流程
每一个进程的主线程的执行都有一个ActivityThread实例里,其中也包含了四个组件的启动和销毁及相关生命周期方法在主线程的执行逻辑;
Android应用程序进程的入口函数是ActivityThread.main()(即Java程序的入口函数);即进程创建完成之后,Android应用程序框架层就会在这进程中将ActivityThread类加载进来,然后执行它的main函数,这个main函数就是进程执行消息循环的地方了;
//ActivityThread.java
//主线程的入口函数
public static void main(String[] args) {
......
//创建主线程的Looper和MessageQueue
Looper.prepareMainLooper();
// Find the value for {@link #PROC_START_SEQ_IDENT} if provided on the command line.
// It will be in the format "seq=114"
long startSeq = 0;
if (args != null) {
for (int i = args.length - 1; i >= 0; --i) {
if (args[i] != null && args[i].startsWith(PROC_START_SEQ_IDENT)) {
startSeq = Long.parseLong(
args[i].substring(PROC_START_SEQ_IDENT.length()));
}
}
}
//创建一个ActivityThread实例,然后调用它的attach函数
//ActivityManagerService通过Binder进程间通信机制通知ActivityThread,启动应用首页
ActivityThread thread = new ActivityThread();
thread.attach(false, startSeq);
if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler();
}
if (false) {
Looper.myLooper().setMessageLogging(new
LogPrinter(Log.DEBUG, "ActivityThread"));
}
// End of event ActivityThreadMain.
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
//开主线程的消息循环
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
这个函数在进程中创建一个ActivityThread实例,然后调用attach函数,接着进入消息循环了,直到最后进程退出;
下面简单说说Android消息循环机制;
1.1Android应用程序的消息机制
1)MessageQueue
MessageQueue叫做消息队列,但是实际上它内部的存储结构是单链表的方式;
2)Looper
Message只是一个消息的存储单元,它不能去处理消息,这个时候Looper就弥补了这个功能