/** * 传入looper对象的构造函数.我们自己传入 * @param looper The looper, must not be null. * 传入looper对象的构造函数 * @param looper The looper, must not be null. */ publicHandler(@NonNull Looper looper) { this(looper, null, false); }
// 代码位于:/frameworks/base/core/java/android/os/MessageQueue.java /** * Handler进行发送消息之后,最终消息会添加到这个消息队列中。 enqueueMessage中首先为msg.target赋值为this, * * @param msg * @param when * @return */ booleanenqueueMessage(Message msg, long when) { // 标记Handler发送的消息的Handler。这个直接影响着将来消息要交给谁执行 // 所以不能为空 if (msg.target == null) { thrownewIllegalArgumentException("Message must have a target."); } // 消息入队列是一个同步代码逻辑 synchronized (this) { // 标记这个消息是否已经使用 if (msg.isInUse()) { thrownewIllegalStateException(msg + " This message is already in use."); } // 如果调用了MessageQueue的quit方法,那么mQuitting是为true if (mQuitting) { IllegalStateExceptione=newIllegalStateException( msg.target + " sending message to a Handler on a dead thread"); Log.w(TAG, e.getMessage(), e); msg.recycle(); returnfalse; } // 标记该消息已经使用。 msg.markInUse(); // 标记消息的处理事件(是一个消息发送事件+延迟时间) msg.when = when; // mMessages 是真正的消息队列的单链表结果 Messagep= mMessages; // 判断是否触发消息队列遍历的唤醒。默认为false boolean needWake; // p是消息队列的头部 // 如果消息队列为空,或者这个消息是立即执行。或者之前队列的第一个消息事件也比当前的msg要迟 // 则这个时候这个消息就要入队列。并且是加入到消息队列的头部 if (p == null || when == 0 || when < p.when) { // New head, wake up the event queue if blocked. msg.next = p; mMessages = msg; // 是否需要唤醒。主要看当前消息队列是否已经阻塞了。如果已经block了。则就需要进行唤醒 // 因为消息队列的头部已经有消息需要处理了。所以需要唤醒啊 // TODO 这里我们可以思考一下什么时候会在进行阻塞消息处理呢 needWake = mBlocked; } else { // Inserted within the middle of the queue. Usually we don't have to wake // up the event queue unless there is a barrier at the head of the queue // and the message is the earliest asynchronous message in the queue. // 如果待加入的消息不添加到消息队列的头部。而是在消息队列的尾部或者中间 // 那么需要唤醒就看: // 1、是否之前阻塞过。 // 2、并且消息队列的头部如果是一个屏障消息。而此消息是一个同步消息 needWake = mBlocked && p.target == null && msg.isAsynchronous(); Message prev; // 这是一个死循环,这个死循环是进行遍历这个消息队列。然后看这个消息插入到哪里比较合适 for (;;) { // 消息队列的双指针遍历。 prev = p; p = p.next; if (p == null || when < p.when) { break; } // 这个地方有意思。如果上面的needWake我们已经设置为true. // 但是我们遍历插入消息的队列的是否。发现这个消息之前还有同步消息 // 那我们其实不需要唤醒的(其实就是已经被唤醒了) if (needWake && p.isAsynchronous()) { needWake = false; } } // 找到消息可以插入的对应为。进行指针引用的重新连接。插入我们的消息 msg.next = p; // invariant: p == prev.next prev.next = msg; } // 如果需要唤醒。我们就执行Native的方法。进行消息队列的唤醒 // We can assume mPtr != 0 because mQuitting is false. if (needWake) { nativeWake(mPtr); } } returntrue; }
// CloseGuard defaults to true and can be quite spammy. We // disable it here, but selectively enable it later (via // StrictMode) on debug builds, but using DropBox, not logs. CloseGuard.setEnabled(false);
Environment.initForCurrentUser(); // Make sure TrustedCertificateStore looks in the right place for CA // certificates finalFileconfigDir= Environment.getUserConfigDirectory(UserHandle.myUserId()); TrustedCertificateStore.setDefaultUserDirectory(configDir);
// Call per-process mainline module initialization. initializeMainlineModules(); Process.setArgV0("<pre-initialized>"); // 初始化主线程功能的Looper // 步骤一:Looper.prepareMainLooper()初始化主线程(UI)的Lopper对象 Looper.prepareMainLooper(); // Find the value for {@link #PROC_START_SEQ_IDENT} if provided on the command // line. // It will be in the format "seq=114" longstartSeq=0; if (args != null) { for (inti= args.length - 1; i >= 0; --i) { if (args[i] != null && args[i].startsWith(PROC_START_SEQ_IDENT)) { startSeq = Long.parseLong(args[i].substring(PROC_START_SEQ_IDENT.length())); } } } // 实例化ActivityThread的对象 // 这个地方就是实例化ActivityThread ActivityThreadthread=newActivityThread(); // thread.attach(false, startSeq);