这是我自己给自己提的问题,或者说是Activity的生命周期函数是怎样运行在主线程的?下面简单分析一下,讨论的问题其实远远不止于这个问题。会涉及到进程的启动,Binder的线程池,ActivityThread中的消息处理。
进程开启
我们最开始接触Android的时候,都知道主线程和非主线程区别,我们可以用Handler来将代码运行在主线程中。而主线程是如何开启的呢?在ActivityThread当中有个公有静态main方法,每次ActivityManagerService请求Zygote进程fork一个新的进程的时候,ActivityManagerService会同时发送一个指定新进程启动哪一个类的参数,ActivityManagerService指定的就是android.app.ActivityThread类。看看ActivityManagerService启动新进程的代码:
if (entryPoint == null) entryPoint = "android.app.ActivityThread";
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "Start proc: " +
app.processName);
checkTime(startTime, "startProcess: asking zygote to start proc");
Process.ProcessStartResult startResult = Process.start(entryPoint,
app.processName, uid, uid, gids, debugFlags, mountExternal,
app.info.targetSdkVersion, app.info.seinfo, requiredAbi, instructionSet,
app.info.dataDir, entryPointArgs);
里面的entryPoint就是指定了zygote会启动的类。Process.start的第一个参数。可以看看Process.start函数,它会直接调用Process的startViaZygote私有静态方法,两个方法的参数是一致的:
private static ProcessStartResult startViaZygote(final String processClass,
final String niceName,
final int uid, final int gid,
final int[] gids,
int debugFlags, int mountExternal,
int targetSdkVersion,
String seInfo,
String abi,
String instructionSet,
String appDataDir,
String[] extraArgs)
throws ZygoteStartFailedEx {
synchronized(Process.class) {
ArrayList<String> argsForZygote = new ArrayList<String>();
// --runtime-args, --setuid=, --setgid=,
// and --setgroups= must go first
argsForZygote.add("--runtime-args");
argsForZygote.add("--setuid=" + uid);
argsForZygote.add("--setgid=" + gid);
if ((debugFlags & Zygote.DEBUG_ENABLE_JNI_LOGGING) != 0) {
argsForZygote.add(&#