2 个回答

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;

参考:

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/app/ActivityThread.java
http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/app/Activity.java
Android应用程序进程启动过程的源代码分析 - by 罗升阳
Android_Message_Handler_消息处理机制总结笔记

@li21 讲的很好,
顺便跟楼主说下,如何自动实现增加Looper
你可以使用HandlerThread

推荐问题
宣传栏