[MessagQueue.java-->MessageQueue.next()] final Message next() { int pendingIdleHandlerCount = -1; int nextPollTimeoutMillis = 0; for (;;) { ...... // mPtr保存了NativeMessageQueue的指针,调用nativePollOnce进行等待 nativePollOnce(mPtr, nextPollTimeoutMillis); synchronized (this) { final long now = SystemClock.uptimeMillis(); // mMessages用来存储消息,这里从其中取一个消息进行处理 final Message msg = mMessages; if (msg != null) { final long when = msg.when; if (now >= when) { mBlocked = false; mMessages = msg.next; msg.next = null; msg.markInUse(); return msg; // 返回一个Message用于给Looper进行派发和处理 } else { nextPollTimeoutMillis = (int) Math.min(when - now, Integer.MAX_VALUE); } } else { nextPollTimeoutMillis = -1; } ...... /* 处理注册的IdleHandler,当MessageQueue中没有Message时, Looper会调用IdleHandler做一些工作,例如做垃圾回收等 */ ...... pendingIdleHandlerCount = 0; nextPollTimeoutMillis = 0; } } }
[MesssageQueue.java-->MessageQueue.enqueueMessage()] final boolean enqueueMessage(Message msg, long when) { ...... final boolean needWake; synchronized (this) { if (mQuiting) { return false; } else if (msg.target == null) { mQuiting = true; } msg.when = when; Message p = mMessages; if (p == null || when == 0 || when < p.when) { /* 如果p为空,表明消息队列中没有消息,那么msg将是第一个消息,needWake需要根据mBlocked 的情况考虑是否触发 */ msg.next = p; mMessages = msg; needWake = mBlocked; } else { // 如果p不为空,表明消息队列中还有剩余消息,需要将新的msg加到消息尾 Message prev = null; while (p != null && p.when <= when) { prev = p; p = p.next; } msg.next = prev.next; prev.next = msg; // 因为消息队列之前还剩余有消息,所以这里不用调用nativeWakeup needWake = false; } } if (needWake) { // 调用nativeWake,以触发nativePollOnce函数结束等待 nativeWake(mPtr); } return true; }
[android_os_MessageQueue.cpp-->android_os_MessageQueue_nativeWake()] static void android_os_MessageQueue_nativeWake(JNIEnv* env, jobject obj, jint ptr) { NativeMessageQueue* nativeMessageQueue = // 取出NativeMessageQueue对象 reinterpret_cast<NativeMessageQueue*>(ptr); return nativeMessageQueue->wake(); // 调用它的wake函数 } [android_os_MessageQueue.cpp-->NativeMessageQueue::wake()] void NativeMessageQueue::wake() { mLooper->wake(); // 层层调用,现在转到mLooper的wake函数 } Native Looper的wake函数代码如下: [Looper.cpp-->Looper::wake()] void Looper::wake() { ssize_t nWrite; do { // 向管道的写端写入一个字符 nWrite = write(mWakeWritePipeFd, "W", 1); } while (nWrite == -1 && errno == EINTR); }