为什么Android系统会给程序的主线程自动添加Looper

Android 在进程的入口函数 ActivityThread.main()中,调用 Looper.prepareMainLooper, 为应用的主线程创建Looper,然后调用Looper.loop()就启动了进程的消息循环,然后就可以处理消息了。

ActivityThread源码:

151 public final class ActivityThread {

2202 private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {

2253 if (activity != null) {

2259 activity.attach(appContext, this, ..., );

5219 public static void main(String[] args) {

// 在这儿调用 Looper.prepareMainLooper, 为应用的主线程创建Looper

5240 Looper.prepareMainLooper();

5242 ActivityThread thread = new ActivityThread();

5245 if (sMainThreadHandler == null) {

5246 sMainThreadHandler = thread.getHandler();

5247 }

5254 Looper.loop();

5257 }

5258}

Looper源码:

52 public final class Looper {

// Initialize the current thread as a looper, marking it as an application's main looper.

// The main looper for your application is created by the Android environment,

// so you should never need to call this function yourself. See also: prepare()

87 public static void prepareMainLooper() {

88 prepare(false);

89 synchronized (Looper.class) {

90 if (sMainLooper != null) {

91 throw new IllegalStateException("The main Looper has already been prepared.");

92 }

93 sMainLooper = myLooper();

94 }

95 }

Activity源码:

660 public class Activity extends ContextThemeWrapper {

699 /*package*/ ActivityThread mMainThread;

5922 final void attach(Context context, ActivityThread aThread, ..., ) {

5944 mMainThread = aThread;