要想理解Handler源码,必须要知道下面这个些类:
ActivityThread:
/**
* @author Eason
* @createtime 2020/3/17
* @desc 程序的入口函数
*/
public final class ActivityThread {
public static void main(String[] args) {
//省略...
//创建全局唯一:主线程Looper对象,并在Looper私有化构造函数里面创建MessageQueue,Looper里面会有一个ThreadLocal与其绑定
//作用:1. 创建全局唯一Looper对象 2. 创建全局唯一MessageQueue对象
Looper.prepareMainLooper();
//省略...
//消息的分发与处理的入口,
//作用:开启循环遍历MessageQueue对象取出Message消息调用msg.target.dispatchMessage方法
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
//下面的代码是UI部分的源码分析,可以不看
private class H extends Handler {
//省略...
public void handleMessage(Message msg) {
switch (msg.what) {
//关键代码:启动Activity会走到这里进行处理
case LAUNCH_ACTIVITY: {
final ActivityClientRecord r = (ActivityClientRecord) msg.obj;
r.packageInfo = getPackageInfoNoCheck(r.activityInfo.applicationInfo, r.compatInfo);
//处理启动逻辑
handleLaunchActivity(r, null);
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
}
break;
case RELAUNCH_ACTIVITY: {
//省略...
}
}
}
}
private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) {
Activity a = performLaunchActivity(r, customIntent);
if (a != null) {
r.createdConfig = new Configuration(mConfiguration);
Bundle oldState = r.state;
//关键代码
handleResumeActivity(r.token, false, r.isForward, !r.activity.mFinished && !r.startsNotResumed);
}
//省略...
}
final void handleResumeActivity(IBinder token, boolean clearHide, boolean isForward, boolean reallyResume) {
ActivityClientRecord r = performResumeActivity(token, clearHide);//这段代码会回调onResume
if (r != null) {
final Activity a = r.activity;
if (r.window == null && !a.mFinished && willBeVisible) {
r.window = r.activity.getWindow();
View decor = r.window.getDecorView();
decor.setVisibility(View.INVISIBLE);
ViewManager wm = a.getWindowManager();//a表示Activity,回到Activity类里面找到getWindowManager方法
WindowManager.LayoutParams l = r.window.getAttributes();
a.mDecor = decor;
l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
l.softInputMode |= forwardBit;
if (a.mVisibleFromClient) {
a.mWindowAdded = true;
wm.addView(decor, l);//关键代码wm是ViewManager对象,由a.getWindowManager()获取,代码跟踪后会发现到最后wm实际就是WindowManagerImpl对象
}
} else if (!willBeVisible) {
if (localLOGV) Slog.v(
TAG, "Launch " + r + " mStartedActivity set");
r.hideForNow = true;
}
}
}
public final ActivityClientRecord performResumeActivity(IBinder token, boolean clearHide) {
ActivityClientRecord r = mActivities.get(token);
if (r != null && !r.activity.mFinished) {
//省略...
//回调Activity的onResume方法
r.activity.performResume();
}
return r;
}
}
Handler:
/**
* @author Eason
* @createtime 2020/3/17
* @desc 作用1:发送消息
* 作用2:处理消息
*/
public class Handler {
final Looper mLooper;
//这个MessageQueue实际就是:在创建Looper的同时创建全局唯一的消息队列MessageQueue
final MessageQueue mQueue;
//创建Handler,同时要给变量Looper和MessageQueue赋值
public Handler() {
this(null, false);
}
//问题:为什么Handler构造方法里面的Looper不是new出来的?
//答:如果在Handler构造方法里面new Looper,怕是不能保证Looper唯一,只有用Looper.prepare()才能保证唯一性。
public Handler(Callback callback, boolean async) {
mLooper = Looper.myLooper();
//这就是为什么不能在子线程new Handler的原因:
//因为他拿出来的Looper为空啊,key是子线程,value拿出来的Looper是为空啊。
if (mLooper == null) {
throw new RuntimeException(
"Can't create handler inside thread " + Thread.currentThread()
+ " that has not called Looper.prepare()");
}
mQueue = mLooper.mQueue;
mCallback = callback;
mAsynchronous = async;
}
//发送消息
public final boolean sendMessage(Message