深入剖析Android消息机制(3)

执行完onStart()方法后,将执行onStartCommand()方法。首先我们从消息池中获取一个Message实例,然后给Message对象的arg1、what、obj三个字段赋值。紧接着调用sendMessage(msg)方法,我们跟踪源代码,该方法将会调用sendMessageDelayed(msg, 0)方法,而sendMessageDelayed()方法又会调用sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis)方法,在该方法中我们要注意该句代码msg.target = this,msg的target指向了this,而this就是ServiceHandler对象,因此msg的target字段指向了ServiceHandler对象,同时该方法又调用MessageQueue 的enqueueMessage(msg, uptimeMillis)方法:

final boolean enqueueMessage(Message msg, long when) {            if (msg.when != 0) {                throw new AndroidRuntimeException(msg                        + " This message is already in use.");            }            if (msg.target == null && !mQuitAllowed) {                throw new RuntimeException("Main thread not allowed to quit");            }            synchronized (this) {                if (mQuiting) {                    RuntimeException e = new RuntimeException(                        msg.target + " sending message to a Handler on a dead thread");                    Log.w("MessageQueue", e.getMessage(), e);                    return false;                } else if (msg.target == null) {                    mQuiting = true;                }                msg.when = when;                //Log.d("MessageQueue", "Enqueing: " + msg);                Message p = mMessages;                if (p == null || when == 0 || when < p.when) {                    msg.next = p;                    mMessages = msg;                    this.notify();                } else {                    Message prev = null;                    while (p != null && p.when <= when) {                        prev = p;                        p = p.next;                    }                    msg.next = prev.next;                    prev.next = msg;                    this.notify();                }            }            return true;        }  

该方法主要的任务就是把Message对象的添加到MessageQueue中(数据结构最基础的东西,自己画图理解下)。

handler.sendMessage()-->handler.sendMessageDelayed()-->handler.sendMessageAtTime()-->msg.target = this;queue.enqueueMessage==>把msg添加到消息队列中

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwxzws.html