- Activity,Android开发必须知道的一个组建,它的生命周期有:onCreate,onStart,onRestart,onResume,onPause,onStop,onDestroy;我们都知道Activity运行在UI线程。
- UI线程在创建时,内部会创建一个Looper对象,我们也知道,Looper.loop()内部是个死循环,每次从MessageQueue中读去新的Message,当没有Message时,MessageQueue会进入阻塞。
那么问题来了,在UI线程阻塞时,Activity中的生命周期是怎么执行的?
UI线程启动
我们知道,在Android系统中,ActivityThread就是UI线程,在启动应用程序时,实质上就时调用ActivityThread的main方法。我们直接查看main方法,发现在mian方法中最后调用Looper.loop()。
public static void main(String[] args) {
...
Looper.prepareMainLooper();
ActivityThread thread = new ActivityThread();
thread.attach(false);
if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler();
}
...
Looper.loop();
}
Activity方法的调用顺序
- 通过Activity的startActivity方法一直向上跟踪:
mMainThread.sendActivityResult(
mToken, child.mEmbeddedID, requestCode,
ar.getResultCode(), ar.getResultData());
我们查看sendActivityResult,发现它其实就是ActivityThread的一个方法。
public final void scheduleSendResult(IBinder token, List<ResultInfo> results) {
ResultData res = new ResultData();
res.token = token;
res.results = results;
sendMessage(H.SEND_RESULT, res);
}
最后实质上,就是通过Handler发送了一个消息。而这个Handler是一个mH对象,我们查看这个mH是什么。
- ActivityThread的mH 对象
final ApplicationThread mAppThread = new ApplicationThread();
final Looper mLooper = Looper.myLooper();
final H mH = new H();
那么H对象是什么呢?里面有哪些内容
private class H extends Handler {
public static final int LAUNCH_ACTIVITY = 100;
public static final int PAUSE_ACTIVITY = 101;
...
public void handleMessage(Message msg) {
switch (msg.what) {
case LAUNCH_ACTIVITY: {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStart");
final ActivityClientRecord r = (ActivityClientRecord) msg.obj;
r.packageInfo = getPackageInfoNoCheck(
r.activityInfo.applicationInfo, r.compatInfo);
handleLaunchActivity(r, null, "LAUNCH_ACTIVITY");
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
} break;
...
}
}
}
可以看到,启动Activity时,实质上是通过ActivityThread,也就是我们说的UI线程中的Handler对象,发送了一个Message。
在Handler的回调,接下来的执行顺序是
handleLaunchActivity();//1
performLaunchActivity();//2
mInstrumentation.callActivityOnCreate()//3
activity.performCreate()//4
- Activity 的performCreate源码如下:
final void performCreate(Bundle icicle) {
restoreHasCurrentPermissionRequest(icicle);
onCreate(icicle);//执行Activity的OnCreate方法
mActivityTransitionState.readState(icicle);
performCreateCommon();
}
Activity 生命周期和Handler的关系
我们在来查看mH,也就是ActivityThread中的Handler对象。可以看到,定义了一系列的消息,Activity的生命周期都有对应的消息。
so: 所以当UI线程中的MessageQueue对象进入等待时,不会影响到Activity生命周期的执行。因为Activity生命周期本身就是一个个的Message,被添加到UI线程中的MessageQueue中。
网友评论