严格来说呢,是卡死了,在ActivityThread类的main方法中调用了Looper.loop()方法之后,后面再没有其他代码,因为根本执行不到,loop()方法的内部就是个死循环,那么为什么Activity的生命周期方法、屏幕的各种点击触摸事件都能正常响应呢?因为在这个死循环中,是不断的从MessageQueue中获取消息的,有消息就处理,没有消息,就阻塞,Activity的各种生命周期函数也是通过发送Message来的到回调的
在ActivityThread中
public void handleMessage(Message msg) {
if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));
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;
case RELAUNCH_ACTIVITY: {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityRestart");
ActivityClientRecord r = (ActivityClientRecord)msg.obj;
handleRelaunchActivity(r);
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
} break;
case PAUSE_ACTIVITY: {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityPause");
SomeArgs args = (SomeArgs) msg.obj;
handlePauseActivity((IBinder) args.arg1, false,
(args.argi1 & USER_LEAVING) != 0, args.argi2,
(args.argi1 & DONT_REPORT) != 0, args.argi3);
maybeSnapshot();
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
} break;
}
}
那么屏幕的触摸事件也是通过发送Message出来的吗?
参考知乎:https://www.zhihu.com/question/62218278
说到底,虽然不是通过Message,但是也是在loop()这个死循环中监听到的。
网友评论