今天我们来分析一下Activity的启动流程:
当用户手指触摸到我们手机屏幕上的icon的时候,这时候我们的程序会进入到我们的入口类中
ActivityThread,当然也像大多数程序一样,比如C、C++,Java都会有一个main方法,我们的Activity中也有一个main方法
1.首先Activity会调用该类中的main方法,来做一些前期的启动分析工作,比如
Looper.prepareMainLooper()
和
Looper.loop()
我们一般在主线程中使用handler的时候是下面这样的
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
//处理消息
}
};
然而我们在子线程中,假如我们要和主线程去传递消息我们必须这样:
//开启一个子线程
new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
//处理消息
}
};
Looper.loop();
}
}).start();
我们在这里看到我们在子线程中调用了Looper.prepare()和Looper.loop()去创建一个消息循环去不断地循环,
这也就解释了我们,为什么在主线程中我们就不用去Looper.prepare()和Looper.loop(),因为我们在ActivityThread中的main方法中已经
开启了一个消息循环。
2.我们在main方法中创建了消息循环后,会去执行该类的attach方法,
ActivityThread thread = new ActivityThread();
thread.attach(false);
3.我们看一下attach方法,我在这里只挑比较重要的代码
final IActivityManager mgr = ActivityManagerNative.getDefault();
去调用ActivityManageNative的getDefault()方法
我们的getDefault()方法干了些什么呢?
IBinder b = ServiceManager.getService("activity");
原来我们从ServiceManager取出getService("activity");
既然我们有getService,那么有没有setService,或者addService呢?带着猎奇的态度我们去看一下,果然我们在ActivityManagerService中找到了
ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true);
ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);
ServiceManager.addService("meminfo", new MemBinder(this));
ServiceManager.addService("gfxinfo", new GraphicsBinder(this));
ServiceManager.addService("dbinfo", new DbBinder(this));
//其中 Context.ACTIVITY_SERVICE
public static final String ACTIVITY_SERVICE = "activity";
4.我们的getDefault方法反回了一个ActivityManagerService,并且将ActivityManagerService对象返回到我们的ActivityThread,
紧接着我们调用了ActivityManagerService的attachApplication
mgr.attachApplication(mAppThread);
并且传过去一个Thread,在 attachApplication中我们调用了ActivityManagerService的attachApplicationLocked,并且将刚才传过来的thread传下去
attachApplicationLocked(thread, callingPid);
做一些基础的检测,比如pid的检查,是否有多个应用程序运行
然后回去调用ActivityStackSupervisor的attachApplicationLocked,
拿到最上面的一个Activity,
ActivityRecord hr = stack.topRunningActivityLocked(null);
该类相当于一个Activity的任务栈
mStackSupervisor.attachApplicationLocked-->realStartActivityLocked(hr, app, true, true)
5. 接着又回到我们的ActivityThread中的scheduleLaunchActivity方法,通过scheduleLaunchActivity进行一些配置
ActivityClientRecord r = new ActivityClientRecord();
r.token = token;
r.ident = ident;
r.intent = intent;
r.referrer = referrer;
r.voiceInteractor = voiceInteractor;
r.activityInfo = info;
r.compatInfo = compatInfo;
r.state = state;
r.persistentState = persistentState;
r.pendingResults = pendingResults;
r.pendingIntents = pendingNewIntents;
r.startsNotResumed = notResumed;
r.isForward = isForward;
r.profilerInfo = profilerInfo;
updatePendingConfiguration(curConfig);
sendMessage(H.LAUNCH_ACTIVITY, r);
并且发送了message,接下来就是处理这些消息了handleLaunchActivity
这里面配置一些window信息,初始化之类的,比较重要的代码
6.Activity a = performLaunchActivity(r, customIntent);
在performLaunchActivity中会调用Instrumentation类的
mInstrumentation.newActivity();
在Instrumentation中会通过反射拿到一个Activity对象并且返回给ActivityThread
然后在ActivityThread中调用Instrumentation对象的callActivityOnCreate(将activity传递过去)
mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
在callActivityOnCreate中会去调用
public void callActivityOnCreate(Activity activity, Bundle icicle,
PersistableBundle persistentState) {
prePerformCreate(activity);
activity.performCreate(icicle, persistentState);
postPerformCreate(activity);
}
//最终调用我们的activity的performCreate方法
final void performCreate(Bundle icicle) {
onCreate(icicle);
mActivityTransitionState.readState(icicle);
performCreateCommon();
}
结合下面的流程图应该更好理解