个人理解,如若有误,欢迎指正
Instrumentation.callActivityOnCreate(Activity, Bundle) line: 1047
ActivityThread.performLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2459ActivityThread.handleLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2512
ActivityThread.access$2200(ActivityThread, ActivityThread$ActivityRecord, Intent) line: 119
ActivityThread$H.handleMessage(Message) line: 1863
ActivityThread$H(Handler).dispatchMessage(Message) line: 99
Looper.loop() line: 123
ActivityThread.main(String[]) line: 4363
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]
Method.invoke(Object, Object...) line: 521
ZygoteInit$MethodAndArgsCaller.run() line: 860
ZygoteInit.main(String[]) line: 618
NativeStart.main(String[]) line: not available [native method]
由于在 ActivityThread.main(String[]) line: 4363 下面的为c++代码,是整个Zygote进程的启动和初始化,还有一些android虚拟机dalvik的加载的部分,这里就不做分析了。。。。。。。本文的主要目的是分析activity的启动过程。
首先,在android源代码的 frameworks.base.core.java.android.app 的文件夹下,有一个ActivityThread的类。。。。。。。。在这个类的最底部,我们可以发现一个main函数
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.main()为入口进入到消息循环处理。对于一个进程来讲,我们需要这个闭合的处理框架。
进入到Looper类中的loop函数,我们可以看到一个无限循环。在循环中可以发现一个Message的队列。每一个message的处理是通过 msg.target.dispatchMessage(msg);来派遣消息完成的。在dispatchMessage的函数里,消息的具体完成则是通过那些实现了interface Callback的类去重写public boolean handleMessage(Message msg);。。。。。。例如:在ActivityThread里我们就可以发现一个继承于Handle类的内部类H( private final class H extends Handler ),它就实现了一个handleMessage的方法。。。。。在这里我们就看到了有关Activity的所有操作
case LAUNCH_ACTIVITY: {
ActivityClientRecord r = (ActivityClientRecord)msg.obj;
r.packageInfo = getPackageInfoNoCheck(
r.activityInfo.applicationInfo);
handleLaunchActivity(r, null);
} break;
case RELAUNCH_ACTIVITY: {
。。。
} break;
case PAUSE_ACTIVITY:
。。。
break;
case PAUSE_ACTIVITY_FINISHING:
。。。
break;
case STOP_ACTIVITY_SHOW:
。。。
break;
case STOP_ACTIVITY_HIDE:
。。。
break;
case SHOW_WINDOW:
。。。
break;
case HIDE_WINDOW:
。。。
break;
case RESUME_ACTIVITY:
。。。
break;
case SEND_RESULT:
。。。
break;
case DESTROY_ACTIVITY:
。。。
break;
case BIND_APPLICATION:
。。。
break;
case EXIT_APPLICATION:
。。。
break;
case NEW_INTENT:
。。。
break;
case RECEIVER:
。。。
break;
case CREATE_SERVICE:
。。。
break;
case BIND_SERVICE:
。。。
break;
case UNBIND_SERVICE:
。。。
break;
case SERVICE_ARGS:
。。。
break;
case STOP_SERVICE:
。。。
break;
case REQUEST_THUMBNAIL:
。。。
break;
case CONFIGURATION_CHANGED:
。。。
break;
case CLEAN_UP_CONTEXT:
。。。
break;
case GC_WHEN_IDLE:
。。。
break;
case DUMP_SERVICE:
。。。
break;
case LOW_MEMORY:
。。。
break;
case ACTIVITY_CONFIGURATION_CHANGED:
。。。
break;
case PROFILER_CONTROL:
。。。
break;
case CREATE_BACKUP_AGENT:
。。。
break;
case DESTROY_BACKUP_AGENT:
。。。
break;
case SUICIDE:
。。。
break;
case REMOVE_PROVIDER:
。。。
break;
case ENABLE_JIT:
。。。
break;
case DISPATCH_PACKAGE_BROADCAST:
。。。
break;
case SCHEDULE_CRASH:
throw new RemoteServiceException((String)msg.obj);
这样,整个世界都明亮了!