这其实是观察者模式的一种实现形式

先明确两个身份 1.RefistrantList 通知者 2.Registrant 观察者,这是一个一对多的关系,在有事件更新时,凡是在名单上登记过的对象,都会收到通知。
RegistrantList通知者支持对通知者的增加(add/addUnique)删除(remove),并且能够发出通知(notifyRegitrants);而Registrant作为观察者,响应通知者发出的notifyRegistrant通知,并由其internalNotifyRegistrants方法响应通知者发出的通知。
整体上这个消息注册机制分为两部分,消息注册和消息通知。其总体思想是:一个对象中开辟一个空间用于存放Message,当调用regist方法时将Message存放进去,当其调用notify方法时将所有Message取出并发送到MessageQueue中等待处理。
下面我们以android 5.0上 来电流程为例讲一下RegistrantList机制的使用。

注册为观察者

1.PstnIncomingCallNotifier这个类中调用mphoneBase中的registerForNewRingingConnection方法注册为观察者,android中的注册为观察者的方法通常写为registerFor***()形式,即为**事件注册消息通知。
PstnIncomingCallNotifier.java
<div class="linenums" style="color: rgb(30, 52, 123); margin-top: 0px; margin-bottom: 0px; padding-left: 0px;"><div class="L0" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    </span><span class="kwd" style="color:#1e347b;">private</span><span class="pln" style="color:#48484c;"> </span><span class="kwd" style="color:#1e347b;">void</span><span class="pln" style="color:#48484c;"> registerForNotifications</span><span class="pun" style="color:#93a1a1;">()</span><span class="pln" style="color:#48484c;"> </span><span class="pun" style="color:#93a1a1;">{</span></code></div><div class="L1" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">        </span><span class="typ" style="color:teal;">Phone</span><span class="pln" style="color:#48484c;"> newPhone </span><span class="pun" style="color:#93a1a1;">=</span><span class="pln" style="color:#48484c;"> mPhoneProxy</span><span class="pun" style="color:#93a1a1;">.</span><span class="pln" style="color:#48484c;">getActivePhone</span><span class="pun" style="color:#93a1a1;">();</span></code></div><div class="L2" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">        </span><span class="kwd" style="color:#1e347b;">if</span><span class="pln" style="color:#48484c;"> </span><span class="pun" style="color:#93a1a1;">(</span><span class="pln" style="color:#48484c;">newPhone </span><span class="pun" style="color:#93a1a1;">!=</span><span class="pln" style="color:#48484c;"> mPhoneBase</span><span class="pun" style="color:#93a1a1;">)</span><span class="pln" style="color:#48484c;"> </span><span class="pun" style="color:#93a1a1;">{</span></code></div><div class="L3" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">            unregisterForNotifications</span><span class="pun" style="color:#93a1a1;">();</span></code></div><div class="L4" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"> </code></div><div class="L5" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">            </span><span class="kwd" style="color:#1e347b;">if</span><span class="pln" style="color:#48484c;"> </span><span class="pun" style="color:#93a1a1;">(</span><span class="pln" style="color:#48484c;">newPhone </span><span class="pun" style="color:#93a1a1;">!=</span><span class="pln" style="color:#48484c;"> </span><span class="kwd" style="color:#1e347b;">null</span><span class="pun" style="color:#93a1a1;">)</span><span class="pln" style="color:#48484c;"> </span><span class="pun" style="color:#93a1a1;">{</span></code></div><div class="L6" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">                </span><span class="typ" style="color:teal;">Log</span><span class="pun" style="color:#93a1a1;">.</span><span class="pln" style="color:#48484c;">i</span><span class="pun" style="color:#93a1a1;">(</span><span class="kwd" style="color:#1e347b;">this</span><span class="pun" style="color:#93a1a1;">,</span><span class="pln" style="color:#48484c;"> </span><span class="str" style="color:#dd1144;">"Registering: %s"</span><span class="pun" style="color:#93a1a1;">,</span><span class="pln" style="color:#48484c;"> newPhone</span><span class="pun" style="color:#93a1a1;">);</span></code></div><div class="L7" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">                mPhoneBase </span><span class="pun" style="color:#93a1a1;">=</span><span class="pln" style="color:#48484c;"> newPhone</span><span class="pun" style="color:#93a1a1;">;</span></code></div><div class="L8" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">                mPhoneBase</span><span class="pun" style="color:#93a1a1;">.</span><span class="pln" style="color:#48484c;background-color: rgb(192, 192, 192);">registerForNewRingingConnection</span><span class="pun" style="color:#93a1a1;">(</span></code></div><div class="L9" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">                        mHandler</span><span class="pun" style="color:#93a1a1;">,</span><span class="pln" style="color:#48484c;"> <span style="color:#ff00;">EVENT_NEW_RINGING_CONNECTION</span></span><span class="pun" style="color:#93a1a1;">,</span><span class="pln" style="color:#48484c;"> </span><span class="kwd" style="color:#1e347b;">null</span><span class="pun" style="color:#93a1a1;">);</span></code></div><div class="L0" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">                mPhoneBase</span><span class="pun" style="color:#93a1a1;">.</span><span class="pln" style="color:#48484c;">registerForCallWaiting</span><span class="pun" style="color:#93a1a1;">(</span></code></div><div class="L1" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">                        mHandler</span><span class="pun" style="color:#93a1a1;">,</span><span class="pln" style="color:#48484c;"> EVENT_CDMA_CALL_WAITING</span><span class="pun" style="color:#93a1a1;">,</span><span class="pln" style="color:#48484c;"> </span><span class="kwd" style="color:#1e347b;">null</span><span class="pun" style="color:#93a1a1;">);</span></code></div><div class="L2" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">                mPhoneBase</span><span class="pun" style="color:#93a1a1;">.</span><span class="pln" style="color:#48484c;">registerForUnknownConnection</span><span class="pun" style="color:#93a1a1;">(</span><span class="pln" style="color:#48484c;">mHandler</span><span class="pun" style="color:#93a1a1;">,</span><span class="pln" style="color:#48484c;"> EVENT_UNKNOWN_CONNECTION</span><span class="pun" style="color:#93a1a1;">,</span></code></div><div class="L3" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">                        </span><span class="kwd" style="color:#1e347b;">null</span><span class="pun" style="color:#93a1a1;">);</span></code></div><div class="L4" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">            </span><span class="pun" style="color:#93a1a1;">}</span></code></div><div class="L5" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">        </span><span class="pun" style="color:#93a1a1;">}</span></code></div><div class="L6" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    </span><span class="pun" style="color:#93a1a1;">}</span></code></div><li style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 12px !important;">
</li></div>

 2. 然后我们看注册为观察者具体是怎么实现的:
调用addUnique添加为观察者
phoneBase.java
<div class="linenums" style="color: rgb(30, 52, 123); margin-top: 0px; margin-bottom: 0px; padding-left: 0px;"><div class="L0" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    </span><span class="com" style="color:#93a1a1;">// Inherited documentation suffices.</span></code></div><div class="L1" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    </span><span class="lit" style="color:#195f91;">@Override</span></code></div><div class="L2" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    </span><span class="kwd" style="color:#1e347b;">public</span><span class="pln" style="color:#48484c;"> </span><span class="kwd" style="color:#1e347b;">void</span><span class="pln" style="color:#48484c;"> registerForNewRingingConnection</span><span class="pun" style="color:#93a1a1;">(</span></code></div><div class="L3" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">            </span><span class="typ" style="color:teal;">Handler</span><span class="pln" style="color:#48484c;"> h</span><span class="pun" style="color:#93a1a1;">,</span><span class="pln" style="color:#48484c;"> </span><span class="kwd" style="color:#1e347b;">int</span><span class="pln" style="color:#48484c;"> <span style="color:#ff00;">what</span></span><span class="pun" style="color:#93a1a1;">,</span><span class="pln" style="color:#48484c;"> </span><span class="typ" style="color:teal;">Object</span><span class="pln" style="color:#48484c;"> obj</span><span class="pun" style="color:#93a1a1;">)</span><span class="pln" style="color:#48484c;"> </span><span class="pun" style="color:#93a1a1;">{</span></code></div><div class="L4" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">        checkCorrectThread</span><span class="pun" style="color:#93a1a1;">(</span><span class="pln" style="color:#48484c;">h</span><span class="pun" style="color:#93a1a1;">);</span></code></div><div class="L5" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"> </code></div><div class="L6" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">        mNewRingingConnectionRegistrants</span><span class="pun" style="color:#93a1a1;">.</span><span class="pln" style="color:#48484c;background-color: rgb(192, 192, 192);">addUnique</span><span class="pun" style="color:#93a1a1;">(</span><span class="pln" style="color:#48484c;">h</span><span class="pun" style="color:#93a1a1;">,</span><span class="pln" style="color:#48484c;"> <span style="color:#ff00;">what</span></span><span class="pun" style="color:#93a1a1;">,</span><span class="pln" style="color:#48484c;"> obj</span><span class="pun" style="color:#93a1a1;">);</span></code></div><div class="L7" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    </span><span class="pun" style="color:#93a1a1;">}</span></code></div></div>

而这个mNewRingingConnectionRegistrants是什么呢?
<div class="linenums" style="color: rgb(30, 52, 123); margin-top: 0px; margin-bottom: 0px; padding-left: 0px;"><div class="L0" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    </span><span class="kwd" style="color:#1e347b;">protected</span><span class="pln" style="color:#48484c;"> </span><span class="kwd" style="color:#1e347b;">final</span><span class="pln" style="color:#48484c;"> </span><span class="typ" style="color:teal;">RegistrantList</span><span class="pln" style="color:#48484c;"> mNewRingingConnectionRegistrants</span></code></div><div class="L1" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">            </span><span class="pun" style="color:#93a1a1;">=</span><span class="pln" style="color:#48484c;"> </span><span class="kwd" style="color:#1e347b;">new</span><span class="pln" style="color:#48484c;"> </span><span class="typ" style="color:teal;">RegistrantList</span><span class="pun" style="color:#93a1a1;">();</span></code></div></div>

mNewRingingConnectionRegistrants是一个RegistrantList 。

3.添加到通知者列表。用传进来的三个参数新建一个观察者,然后将其添加到通知者所要通知对象的列表中
RefistrantList.java 
<div class="linenums" style="color: rgb(30, 52, 123); margin-top: 0px; margin-bottom: 0px; padding-left: 0px;"><div class="L0" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    </span><span class="kwd" style="color:#1e347b;">public</span><span class="pln" style="color:#48484c;"> </span><span class="kwd" style="color:#1e347b;">synchronized</span><span class="pln" style="color:#48484c;"> </span><span class="kwd" style="color:#1e347b;">void</span></code></div><div class="L1" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    addUnique</span><span class="pun" style="color:#93a1a1;">(</span><span class="typ" style="color:teal;">Handler</span><span class="pln" style="color:#48484c;"> h</span><span class="pun" style="color:#93a1a1;">,</span><span class="pln" style="color:#48484c;"> </span><span class="kwd" style="color:#1e347b;">int</span><span class="pln" style="color:#48484c;"> what</span><span class="pun" style="color:#93a1a1;">,</span><span class="pln" style="color:#48484c;"> </span><span class="typ" style="color:teal;">Object</span><span class="pln" style="color:#48484c;"> obj</span><span class="pun" style="color:#93a1a1;">)</span></code></div><div class="L2" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    </span><span class="pun" style="color:#93a1a1;">{</span></code></div><div class="L3" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">        </span><span class="com" style="color:#93a1a1;">// if the handler is already in the registrant list, remove it</span></code></div><div class="L4" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">        remove</span><span class="pun" style="color:#93a1a1;">(</span><span class="pln" style="color:#48484c;">h</span><span class="pun" style="color:#93a1a1;">);</span></code></div><div class="L4" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pun" style="color:#93a1a1;">       <span style="background-color: rgb(192, 192, 192);">add</span>(new <span style="background-color: rgb(192, 192, 192);">Registrant</span>(h, <span style="color:#ff00;">what</span>, obj));
</span></code></div><div class="L4" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pun" style="color:#93a1a1;">    }</span></code></div><div class="L5" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;"> </span></code></div></div>

3.1新建一个Registrant观察者
<div class="linenums" style="color: rgb(30, 52, 123); margin-top: 0px; margin-bottom: 0px; padding-left: 0px;"><div class="L0" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    </span><span class="kwd" style="color:#1e347b;">public</span></code></div><div class="L1" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    </span><span class="typ" style="color:teal;">Registrant</span><span class="pun" style="color:#93a1a1;">(</span><span class="typ" style="color:teal;">Handler</span><span class="pln" style="color:#48484c;"> h</span><span class="pun" style="color:#93a1a1;">,</span><span class="pln" style="color:#48484c;"> </span><span class="kwd" style="color:#1e347b;">int</span><span class="pln" style="color:#48484c;"> what</span><span class="pun" style="color:#93a1a1;">,</span><span class="pln" style="color:#48484c;"> </span><span class="typ" style="color:teal;">Object</span><span class="pln" style="color:#48484c;"> obj</span><span class="pun" style="color:#93a1a1;">)</span></code></div><div class="L2" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    </span><span class="pun" style="color:#93a1a1;">{</span></code></div><div class="L3" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">        refH </span><span class="pun" style="color:#93a1a1;">=</span><span class="pln" style="color:#48484c;"> </span><span class="kwd" style="color:#1e347b;">new</span><span class="pln" style="color:#48484c;"> </span><span class="typ" style="color:teal;">WeakReference</span><span class="pun" style="color:#93a1a1;">(</span><span class="pln" style="color:#48484c;">h</span><span class="pun" style="color:#93a1a1;">);//Handler 泛型WeakReference</span></code></div><div class="L4" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">        </span><span class="kwd" style="color:#1e347b;">this</span><span class="pun" style="color:#93a1a1;">.</span><span class="pln" style="color:#48484c;">what </span><span class="pun" style="color:#93a1a1;">=</span><span class="pln" style="color:#48484c;"> <span style="color:#ff00;">what</span></span><span class="pun" style="color:#93a1a1;">;//消息类型</span></code></div><div class="L5" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">        userObj </span><span class="pun" style="color:#93a1a1;">=</span><span class="pln" style="color:#48484c;"> obj</span><span class="pun" style="color:#93a1a1;">;//Object数据对象,用于封装传递的数据</span></code></div><div class="L6" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    </span><span class="pun" style="color:#93a1a1;">}</span></code></div></div>

3.2添加到通知者须通知的对象的列表中,用列表保存观察者。registrants对象就是一个ArrayList。
到此我们看到,RegistrantList维护了一个Registrants对象,而Registrants管理了多个Registrant。
<div class="linenums" style="color: rgb(30, 52, 123); margin-top: 0px; margin-bottom: 0px; padding-left: 0px;"><div class="L0" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    </span><span class="kwd" style="color:#1e347b;">public</span><span class="pln" style="color:#48484c;"> </span><span class="kwd" style="color:#1e347b;">synchronized</span><span class="pln" style="color:#48484c;"> </span><span class="kwd" style="color:#1e347b;">void</span></code></div><div class="L1" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    add</span><span class="pun" style="color:#93a1a1;">(</span><span class="typ" style="color:teal;">Registrant</span><span class="pln" style="color:#48484c;"> r</span><span class="pun" style="color:#93a1a1;">)</span></code></div><div class="L2" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    </span><span class="pun" style="color:#93a1a1;">{</span></code></div><div class="L3" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">        removeCleared</span><span class="pun" style="color:#93a1a1;">();</span></code></div><div class="L4" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">        registrants</span><span class="pun" style="color:#93a1a1;">.</span><span class="pln" style="color:#48484c;background-color: rgb(192, 192, 192);">add</span><span class="pun" style="color:#93a1a1;">(</span><span class="pln" style="color:#48484c;">r</span><span class="pun" style="color:#93a1a1;">);</span></code></div><div class="L5" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    </span><span class="pun" style="color:#93a1a1;">}</span></code></div></div>

自此消息的注册完成。

发出通知

1.handlePollCalls方法根据RIL发出的Call List对象判断Call的状态,并发出不同的通知,
有新的来电将执行: phone.notifyNewRingingConnection; 
Connection newRinging = null; //or waiting
<div class="linenums" style="color: rgb(30, 52, 123); margin-top: 0px; margin-bottom: 0px; padding-left: 0px;"><div class="L0" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="kwd" style="color:#1e347b;">handlePollCalls(){</span></code></div><div class="L0" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><span style="color:#1e347b;">...</span></div><div class="L0" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="kwd" style="color:#1e347b;">if</span><span class="pln" style="color:#48484c;"> </span><span class="pun" style="color:#93a1a1;">(</span><span class="pln" style="color:#48484c;">newRinging </span><span class="pun" style="color:#93a1a1;">!=</span><span class="pln" style="color:#48484c;"> </span><span class="kwd" style="color:#1e347b;">null</span><span class="pun" style="color:#93a1a1;">)</span><span class="pln" style="color:#48484c;"> </span><span class="pun" style="color:#93a1a1;">{</span></code></div><div class="L1" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">            mPhone</span><span class="pun" style="color:#93a1a1;">.</span><span class="pln" style="color:#48484c;background-color: rgb(192, 192, 192);">notifyNewRingingConnection</span><span class="pun" style="color:#93a1a1;">(</span><span class="pln" style="color:#48484c;">newRinging</span><span class="pun" style="color:#93a1a1;">);</span></code></div><div class="L2" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">        </span><span class="pun" style="color:#93a1a1;">}</span></code></div></div>

2.GSMPhone.java

<div class="linenums" style="color: rgb(30, 52, 123); margin-top: 0px; margin-bottom: 0px; padding-left: 0px;"><div class="L0" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-c" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;"> </span><span class="kwd" style="color:#1e347b;">public</span><span class="pln" style="color:#48484c;"> </span><span class="kwd" style="color:#1e347b;">void</span><span class="pln" style="color:#48484c;"> notifyNewRingingConnection</span><span class="pun" style="color:#93a1a1;">(</span><span class="typ" style="color:teal;">Connection</span><span class="pln" style="color:#48484c;"> c</span><span class="pun" style="color:#93a1a1;">)</span><span class="pln" style="color:#48484c;"> </span><span class="pun" style="color:#93a1a1;">{</span></code></div><div class="L1" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-c" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">        super</span><span class="pun" style="color:#93a1a1;">.</span><span class="pln" style="color:#48484c;background-color: rgb(192, 192, 192);">notifyNewRingingConnectionP</span><span class="pun" style="color:#93a1a1;">(</span><span class="pln" style="color:#48484c;">c</span><span class="pun" style="color:#93a1a1;">);</span></code></div><div class="L2" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-c" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    </span><span class="pun" style="color:#93a1a1;">}</span></code></div></div>

调用父类 PhoneBase.java notifyNewRingingConnectionP()发出来电通知 mNewRingingConnectionRegistrants.notifyRegistrants(ar); 
前面有说过mNewRingingConnectionRegistrants是一个RegistrantList通知者
<div class="linenums" style="color: rgb(30, 52, 123); margin-top: 0px; margin-bottom: 0px; padding-left: 0px;"><div class="L0" style="color: rgb(190, 190, 197); padding-left: 0px; list-style-type: none;"><code class="language-c" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="com" style="color:#93a1a1;">/**</span></code></div><div class="L1" style="color: rgb(190, 190, 197); padding-left: 0px; list-style-type: none;"><code class="language-c" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="com" style="color:#93a1a1;">     * Notify registrants of a new ringing Connection.</span></code></div><div class="L2" style="color: rgb(190, 190, 197); padding-left: 0px; list-style-type: none;"><code class="language-c" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="com" style="color:#93a1a1;">     * Subclasses of Phone probably want to replace this with a</span></code></div><div class="L3" style="color: rgb(190, 190, 197); padding-left: 0px; list-style-type: none;"><code class="language-c" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="com" style="color:#93a1a1;">     * version scoped to their packages</span></code></div><div class="L4" style="color: rgb(190, 190, 197); padding-left: 0px; list-style-type: none;"><code class="language-c" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="com" style="color:#93a1a1;">     */</span></code></div><div class="L5" style="color: rgb(190, 190, 197); padding-left: 0px; list-style-type: none;"><code class="language-c" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    </span><span class="kwd" style="color:#1e347b;">public</span><span class="pln" style="color:#48484c;"> </span><span class="kwd" style="color:#1e347b;">void</span><span class="pln" style="color:#48484c;"> notifyNewRingingConnectionP</span><span class="pun" style="color:#93a1a1;">(</span><span class="typ" style="color:teal;">Connection</span><span class="pln" style="color:#48484c;"> cn</span><span class="pun" style="color:#93a1a1;">)</span><span class="pln" style="color:#48484c;"> </span><span class="pun" style="color:#93a1a1;">{</span></code></div><div class="L6" style="color: rgb(190, 190, 197); padding-left: 0px; list-style-type: none;"><code class="language-c" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">        </span><span class="kwd" style="color:#1e347b;">if</span><span class="pln" style="color:#48484c;"> </span><span class="pun" style="color:#93a1a1;">(!</span><span class="pln" style="color:#48484c;">mIsVoiceCapable</span><span class="pun" style="color:#93a1a1;">)</span></code></div><div class="L7" style="color: rgb(190, 190, 197); padding-left: 0px; list-style-type: none;"><code class="language-c" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">            </span><span class="kwd" style="color:#1e347b;">return</span><span class="pun" style="color:#93a1a1;">;</span></code></div><div class="L8" style="color: rgb(190, 190, 197); padding-left: 0px; list-style-type: none;"><code class="language-c" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">        </span><span class="typ" style="color:teal;">AsyncResult</span><span class="pln" style="color:#48484c;"> ar </span><span class="pun" style="color:#93a1a1;">=</span><span class="pln" style="color:#48484c;"> </span><span class="kwd" style="color:#1e347b;">new</span><span class="pln" style="color:#48484c;"> </span><span class="typ" style="color:teal;">AsyncResult</span><span class="pun" style="color:#93a1a1;">(</span><span class="pln" style="color:#48484c;">null</span><span class="pun" style="color:#93a1a1;">,</span><span class="pln" style="color:#48484c;"> cn</span><span class="pun" style="color:#93a1a1;">,</span><span class="pln" style="color:#48484c;"> null</span><span class="pun" style="color:#93a1a1;">);</span></code></div><div class="L9" style="color: rgb(190, 190, 197); padding-left: 0px; list-style-type: none;"><code class="language-c" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">        mNewRingingConnectionRegistrants</span><span class="pun" style="color:#93a1a1;">.</span><span class="pln" style="color:#48484c;background-color: rgb(192, 192, 192);">notifyRegistrants</span><span class="pun" style="color:#93a1a1;">(</span><span class="pln" style="color:#48484c;">ar</span><span class="pun" style="color:#93a1a1;">);</span></code></div><div class="L0" style="color: rgb(190, 190, 197); padding-left: 0px; list-style-type: none;"><code class="language-c" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    </span><span class="pun" style="color:#93a1a1;">}</span></code></div></div>

通知者RegistrantList.java 
通知者调用内部的通知观察者的方法
<div class="linenums" style="color: rgb(30, 52, 123); margin-top: 0px; margin-bottom: 0px; padding-left: 0px;"><div class="L0" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    </span><span class="kwd" style="color:#1e347b;">public</span><span class="pln" style="color:#48484c;"> </span><span class="com" style="color:#93a1a1;">/*synchronized*/</span><span class="pln" style="color:#48484c;"> </span><span class="kwd" style="color:#1e347b;">void</span></code></div><div class="L1" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    notifyRegistrants</span><span class="pun" style="color:#93a1a1;">(</span><span class="typ" style="color:teal;">AsyncResult</span><span class="pln" style="color:#48484c;"> ar</span><span class="pun" style="color:#93a1a1;">)</span></code></div><div class="L2" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    </span><span class="pun" style="color:#93a1a1;">{</span></code></div><div class="L3" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">        <span style="background-color: rgb(192, 192, 192);">internalNotifyRegistrants</span></span><span class="pun" style="color:#93a1a1;">(</span><span class="pln" style="color:#48484c;">ar</span><span class="pun" style="color:#93a1a1;">.</span><span class="pln" style="color:#48484c;">result</span><span class="pun" style="color:#93a1a1;">,</span><span class="pln" style="color:#48484c;"> ar</span><span class="pun" style="color:#93a1a1;">.</span><span class="pln" style="color:#48484c;">exception</span><span class="pun" style="color:#93a1a1;">);</span></code></div><div class="L4" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    </span><span class="pun" style="color:#93a1a1;">}</span></code></div></div>

一般来说观察者不止一个,所以用for循环遍历感兴趣的观察者,调用观察内部的internalNotifyRegistrant()响应通知
<div class="linenums" style="margin-top: 0px; margin-bottom: 0px; padding-left: 0px;"><div class="L0" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    </span><span class="kwd" style="color:#1e347b;">private</span><span class="pln" style="color:#48484c;"> </span><span class="kwd" style="color:#1e347b;">synchronized</span><span class="pln" style="color:#48484c;"> </span><span class="kwd" style="color:#1e347b;">void</span></code></div><div class="L1" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    internalNotifyRegistrants </span><span class="pun" style="color:#93a1a1;">(</span><span class="typ" style="color:teal;">Object</span><span class="pln" style="color:#48484c;"> result</span><span class="pun" style="color:#93a1a1;">,</span><span class="pln" style="color:#48484c;"> </span><span class="typ" style="color:teal;">Throwable</span><span class="pln" style="color:#48484c;"> exception</span><span class="pun" style="color:#93a1a1;">)</span></code></div><div class="L2" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    </span><span class="pun" style="color:#93a1a1;">{</span></code></div><div class="L3" style="line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;"><span style="color:#bebec5;">      </span><span style="color:#ff00;"> </span></span><span style="color:#ff00;"><span class="kwd" style="color:#1e347b;">for</span><span class="pln" style="color:#48484c;"> </span><span class="pun" style="color:#93a1a1;">(</span><span class="kwd" style="color:#1e347b;">int</span><span class="pln" style="color:#48484c;"> i </span><span class="pun" style="color:#93a1a1;">=</span><span class="pln" style="color:#48484c;"> </span><span class="lit" style="color:#195f91;">0</span><span class="pun" style="color:#93a1a1;">,</span><span class="pln" style="color:#48484c;"> s </span><span class="pun" style="color:#93a1a1;">=</span><span class="pln" style="color:#48484c;"> registrants</span><span class="pun" style="color:#93a1a1;">.</span><span class="pln" style="color:#48484c;">size</span><span class="pun" style="color:#93a1a1;">();</span><span class="pln" style="color:#48484c;"> i </span><span class="pun" style="color:#93a1a1;"><</span><span class="pln" style="color:#48484c;"> s </span><span class="pun" style="color:#93a1a1;">;</span><span class="pln" style="color:#48484c;"> i</span><span class="pun" style="color:#93a1a1;">++)</span><span class="pln" style="color:#48484c;"> </span></span><span class="pun" style="color:#bebec5;">{</span></code></div><div class="L4" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">            </span><span class="typ" style="color:teal;">Registrant</span><span class="pln" style="color:#48484c;">  r </span><span class="pun" style="color:#93a1a1;">=</span><span class="pln" style="color:#48484c;"> </span><span class="pun" style="color:#93a1a1;">(</span><span class="typ" style="color:teal;">Registrant</span><span class="pun" style="color:#93a1a1;">)</span><span class="pln" style="color:#48484c;"> registrants</span><span class="pun" style="color:#93a1a1;">.</span><span class="pln" style="color:#48484c;">get</span><span class="pun" style="color:#93a1a1;">(</span><span class="pln" style="color:#48484c;">i</span><span class="pun" style="color:#93a1a1;">);</span></code></div><div class="L5" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">            r</span><span class="pun" style="color:#93a1a1;">.</span><span class="pln" style="color:#48484c;background-color: rgb(192, 192, 192);">internalNotifyRegistrant</span><span class="pun" style="color:#93a1a1;">(</span><span class="pln" style="color:#48484c;">result</span><span class="pun" style="color:#93a1a1;">,</span><span class="pln" style="color:#48484c;"> exception</span><span class="pun" style="color:#93a1a1;">);</span></code></div><div class="L6" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">       </span><span class="pun" style="color:#93a1a1;">}</span></code></div><div class="L7" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    </span><span class="pun" style="color:#93a1a1;">}</span></code></div></div>

s= registrants.size() 获得观察者数量。

响应通知消息

Registrant.java

响应通知
<div class="linenums" style="margin-top: 0px; margin-bottom: 0px; padding-left: 0px;"><div class="L0" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    </span><span class="com" style="color:#93a1a1;">/*package*/</span><span class="pln" style="color:#48484c;"> </span><span class="kwd" style="color:#1e347b;">void</span></code></div><div class="L1" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    internalNotifyRegistrant </span><span class="pun" style="color:#93a1a1;">(</span><span class="typ" style="color:teal;">Object</span><span class="pln" style="color:#48484c;"> result</span><span class="pun" style="color:#93a1a1;">,</span><span class="pln" style="color:#48484c;"> </span><span class="typ" style="color:teal;">Throwable</span><span class="pln" style="color:#48484c;"> exception</span><span class="pun" style="color:#93a1a1;">)</span></code></div><div class="L2" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    </span><span class="pun" style="color:#93a1a1;">{</span></code></div><div class="L3" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">        </span><span class="typ" style="color:teal;">Handler</span><span class="pln" style="color:#48484c;"> h </span><span class="pun" style="color:#93a1a1;">=</span><span class="pln" style="color:#48484c;"> getHandler</span><span class="pun" style="color:#93a1a1;">();</span></code></div><div class="L4" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"> </code></div><div class="L5" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">        </span><span class="kwd" style="color:#1e347b;">if</span><span class="pln" style="color:#48484c;"> </span><span class="pun" style="color:#93a1a1;">(</span><span class="pln" style="color:#48484c;">h </span><span class="pun" style="color:#93a1a1;">==</span><span class="pln" style="color:#48484c;"> </span><span class="kwd" style="color:#1e347b;">null</span><span class="pun" style="color:#93a1a1;">)</span><span class="pln" style="color:#48484c;"> </span><span class="pun" style="color:#93a1a1;">{</span></code></div><div class="L6" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">            clear</span><span class="pun" style="color:#93a1a1;">();</span></code></div><div class="L7" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">        </span><span class="pun" style="color:#93a1a1;">}</span><span class="pln" style="color:#48484c;"> </span><span class="kwd" style="color:#1e347b;">else</span><span class="pln" style="color:#48484c;"> </span><span class="pun" style="color:#93a1a1;">{</span></code></div><div class="L8" style="line-height: 18px; padding-left: 0px; list-style-type: none; color: rgb(190, 190, 197);"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">            </span><span class="typ" style="color:teal;">Message</span><span class="pln" style="color:#48484c;"> msg </span><span class="pun" style="color:#93a1a1;">=</span><span class="pln" style="color:#48484c;"> </span><span class="typ" style="color:teal;">Message</span><span class="pun" style="color:#93a1a1;">.</span><span class="pln" style="color:#48484c;">obtain</span><span class="pun" style="color:#93a1a1;">();</span></code></div><div class="L9" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"> </code></div><div class="L0" style="line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#bebec5;">            msg</span><span class="pun" style="color:#bebec5;">.</span><span class="pln" style="color:#bebec5;">what </span><span class="pun" style="color:#bebec5;">=</span><span class="pln" style="color:#48484c;"><span style="color:#bebec5;"> </span><span style="color:#ff00;">what</span></span><span class="pun" style="color:#bebec5;">;</span></code></div><div class="L1" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">            </span></code></div><div class="L2" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">            msg</span><span class="pun" style="color:#93a1a1;">.</span><span class="pln" style="color:#48484c;">obj </span><span class="pun" style="color:#93a1a1;">=</span><span class="pln" style="color:#48484c;"> </span><span class="kwd" style="color:#1e347b;">new</span><span class="pln" style="color:#48484c;"> </span><span class="typ" style="color:teal;">AsyncResult</span><span class="pun" style="color:#93a1a1;">(</span><span class="pln" style="color:#48484c;">userObj</span><span class="pun" style="color:#93a1a1;">,</span><span class="pln" style="color:#48484c;"> result</span><span class="pun" style="color:#93a1a1;">,</span><span class="pln" style="color:#48484c;"> exception</span><span class="pun" style="color:#93a1a1;">);</span></code></div><div class="L3" style="line-height: 18px; padding-left: 0px; list-style-type: none; color: rgb(190, 190, 197);"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">            </span></code></div><div class="L4" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">            h</span><span class="pun" style="color:#93a1a1;">.</span><span class="pln" style="color:#48484c;background-color: rgb(192, 192, 192);">sendMessage</span><span class="pun" style="color:#93a1a1;">(</span><span class="pln" style="color:#48484c;">msg</span><span class="pun" style="color:#93a1a1;">);</span></code></div><div class="L5" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">        </span><span class="pun" style="color:#93a1a1;">}</span></code></div><div class="L6" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    </span><span class="pun" style="color:#93a1a1;">}</span></code></div></div>

这个消息是一开始注册为观察者就携带进去的

<div class="linenums" style="color: rgb(30, 52, 123); margin-top: 0px; margin-bottom: 0px; padding-left: 0px;"><div class="L0" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    </span><span class="kwd" style="color:#1e347b;">private</span><span class="pln" style="color:#48484c;"> </span><span class="kwd" style="color:#1e347b;">final</span><span class="pln" style="color:#48484c;"> </span><span class="typ" style="color:teal;">Handler</span><span class="pln" style="color:#48484c;"> <span style="color:#ff00;">mHandler </span></span><span class="pun" style="color:#93a1a1;">=</span><span class="pln" style="color:#48484c;"> </span><span class="kwd" style="color:#1e347b;">new</span><span class="pln" style="color:#48484c;"> </span><span class="typ" style="color:teal;">Handler</span><span class="pun" style="color:#93a1a1;">()</span><span class="pln" style="color:#48484c;"> </span><span class="pun" style="color:#93a1a1;">{</span></code></div><div class="L1" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">        </span><span class="lit" style="color:#195f91;">@Override</span></code></div><div class="L2" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">        </span><span class="kwd" style="color:#1e347b;">public</span><span class="pln" style="color:#48484c;"> </span><span class="kwd" style="color:#1e347b;">void</span><span class="pln" style="color:#48484c;"> handleMessage</span><span class="pun" style="color:#93a1a1;">(</span><span class="typ" style="color:teal;">Message</span><span class="pln" style="color:#48484c;"> msg</span><span class="pun" style="color:#93a1a1;">)</span><span class="pln" style="color:#48484c;"> </span><span class="pun" style="color:#93a1a1;">{</span></code></div><div class="L3" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">            </span><span class="kwd" style="color:#1e347b;">switch</span><span class="pun" style="color:#93a1a1;">(</span><span class="pln" style="color:#48484c;">msg</span><span class="pun" style="color:#93a1a1;">.</span><span class="pln" style="color:#48484c;">what</span><span class="pun" style="color:#93a1a1;">)</span><span class="pln" style="color:#48484c;"> </span><span class="pun" style="color:#93a1a1;">{</span></code></div><div class="L4" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">                </span><span class="kwd" style="color:#1e347b;">case</span><span class="pln" style="color:#48484c;"> <span style="background-color: rgb(192, 192, 192);">EVENT_NEW_RINGING_CONNECTION</span></span><span class="pun" style="color:#93a1a1;">:</span></code></div><div class="L5" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">                    handleNewRingingConnection</span><span class="pun" style="color:#93a1a1;">((</span><span class="typ" style="color:teal;">AsyncResult</span><span class="pun" style="color:#93a1a1;">)</span><span class="pln" style="color:#48484c;"> msg</span><span class="pun" style="color:#93a1a1;">.</span><span class="pln" style="color:#48484c;">obj</span><span class="pun" style="color:#93a1a1;">);</span></code></div><div class="L6" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">                    </span><span class="kwd" style="color:#1e347b;">break</span><span class="pun" style="color:#93a1a1;">;</span></code></div><div class="L7" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">                </span><span class="kwd" style="color:#1e347b;">case</span><span class="pln" style="color:#48484c;"> EVENT_CDMA_CALL_WAITING</span><span class="pun" style="color:#93a1a1;">:</span></code></div><div class="L8" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">                    handleCdmaCallWaiting</span><span class="pun" style="color:#93a1a1;">((</span><span class="typ" style="color:teal;">AsyncResult</span><span class="pun" style="color:#93a1a1;">)</span><span class="pln" style="color:#48484c;"> msg</span><span class="pun" style="color:#93a1a1;">.</span><span class="pln" style="color:#48484c;">obj</span><span class="pun" style="color:#93a1a1;">);</span></code></div><div class="L9" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">                    </span><span class="kwd" style="color:#1e347b;">break</span><span class="pun" style="color:#93a1a1;">;</span></code></div><div class="L0" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">                </span><span class="kwd" style="color:#1e347b;">case</span><span class="pln" style="color:#48484c;"> EVENT_UNKNOWN_CONNECTION</span><span class="pun" style="color:#93a1a1;">:</span></code></div><div class="L1" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">                    handleNewUnknownConnection</span><span class="pun" style="color:#93a1a1;">((</span><span class="typ" style="color:teal;">AsyncResult</span><span class="pun" style="color:#93a1a1;">)</span><span class="pln" style="color:#48484c;"> msg</span><span class="pun" style="color:#93a1a1;">.</span><span class="pln" style="color:#48484c;">obj</span><span class="pun" style="color:#93a1a1;">);</span></code></div><div class="L2" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">                    </span><span class="kwd" style="color:#1e347b;">break</span><span class="pun" style="color:#93a1a1;">;</span></code></div><div class="L3" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">                </span><span class="kwd" style="color:#1e347b;">default</span><span class="pun" style="color:#93a1a1;">:</span></code></div><div class="L4" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">                    </span><span class="kwd" style="color:#1e347b;">break</span><span class="pun" style="color:#93a1a1;">;</span></code></div><div class="L5" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">            </span><span class="pun" style="color:#93a1a1;">}</span></code></div><div class="L6" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">        </span><span class="pun" style="color:#93a1a1;">}</span></code></div><div class="L7" style="color: rgb(190, 190, 197); line-height: 18px; padding-left: 0px; list-style-type: none;"><code class="language-java" style="font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; word-wrap: break-word;"><span class="pln" style="color:#48484c;">    </span><span class="pun" style="color:#93a1a1;">};</span></code></div></div>

至于响应通知做了什么工作不是这次的重点。

=====补充======

Message msg = Message.obtain():
Handler h = getHandler();
h.sendMessage(msg);
从obtain()的源代码中我们可以知道,它是静态方法,而且只有在spool = null 的情况下才会new出一个Message(),返回一个Message对象,如果在不为空的情况下,Message的对象都是从Message对象池里面拿的实例从而重复使用的,这也为了Android中的Message对象能够更好的回收。
使用Handler中的sendMessage (Message msg)方式来发送消息.
我们可以知道android 中发送消息不管是Message中的几种重载的obtain()方式,还是Handler中的几种重载的sendMessage最终都是通过Handler.sendMessage来发送的,而Handler中的几种sendMessage()重载方法最终都会调用到sendMessageAtTime()方法来完成消息的入队操作。
发送一个消息到消息队列的对尾,它会在处理这个时间的线程中的handleMessage(Message),方法中被接受到并且处理。

原文地址: http://blog.csdn.net/aaa111/article/details/43833757

Android 中 RegistrantList消息处理机制 以android 5.0 MT为例相关推荐

  1. android classloader异常,Android中ClassLoader类加载机制

    Android中apk的构建过程 构建apk 如图 所示,典型 Android 应用模块的构建流程通常依循下列步骤: 编译器将您的源代码转换成 DEX(Dalvik Executable) 文件(其中 ...

  2. 浅析Android中的消息机制

    在分析Android消息机制之前,我们先来看一段代码: [java] view plaincopy public class MainActivity extends Activity impleme ...

  3. 重温Android中的消息机制

    引入: 提到Android中的消息机制,大家应该都不陌生,我们在开发中不可避免的要和它打交道.从我们开发的角度来看,Handler是Android消息机制的上层接口.我们在平时的开发中只需要和Hand ...

  4. 探索Android中的Parcel机制(上)

    一.先从Serialize说起 我们都知道JAVA中的Serialize机制,译成串行化.序列化--,其作用是能将数据对象存入字节流其中,在须要时又一次生成对象.主要应用是利用外部存储设备保存对象状态 ...

  5. 探索Android中的Parcel机制(上) .

    一.先从Serialize说起 我们都知道JAVA中的Serialize机制,译成串行化.序列化--,其作用是能将数据对象存入字节流当中,在需要时重新生成对象.主要应用是利用外部存储设备保存对象状态, ...

  6. Android中的消息机制

    Android 中的消息机制其实就是指的是 Handler 消息机制以及附带的 Looper 和 MessageQueue 的工作流程. 1.Android 为什么提供Handler? 解决子线程不能 ...

  7. Android中Alarm的机制

    本次给大家分析的是Android中Alarm的机制所用源码为最新的Android4.4.4.首先简单介绍如何使用Alarm并给出其工作原理,接着分析Alarm和Timer以及Handler在完成定时任 ...

  8. 探索Android中的Parcel机制(下)

    上一篇中我们透过源码看到了Parcel背后的机制,本质上把它当成一个Serialize就可以了,只是它是在内存中完成的序列化和反序列化,利用的是连续的内存空间,因此会更加高效. 我们接下来要说的是Pa ...

  9. android系统的alarm机制,Android中Alarm的机制

    本次给大家分析的是Android中Alarm的机制所用源码为最新的Android4.4.4.首先简单介绍如何使用Alarm并给出其工作原理,接着分析Alarm和Timer以及Handler在完成定时任 ...

最新文章

  1. 学习笔记(十四)——MySQL(CRUD)
  2. python安全攻防---scapy基础---计算机网络各层协议
  3. 1380C. Create The Teams
  4. 一种基于邻域的聚类算法
  5. 苹果叒要开发布会了!多款新机曝光,Intel不淡定了
  6. 郑州轻工业学校计算机网络,计算机网络期末考试a卷(郑州轻工业学院).doc
  7. python 复制列表内容_Python复制列表列表
  8. jmeter 计数器_jmeter函数(六)
  9. 免费获取小红伞互联网安全套装2012-90天的小红伞2012激活码激活密钥小红伞
  10. 软件工程基础知识--系统设计
  11. NVIDIA Jetson TK1学习与开发(二):入门指导
  12. BiliBili 扭蛋机
  13. 微信二维码没有扫描id
  14. T1114 白细胞计数(信息学一本通C++)
  15. 【阅读笔记】低照度图像增强-《Fast efficient algorithm for enhancement of low lighting video》
  16. 最菜的我之打卡第三天
  17. 微信小程序图片等比缩放显示正中间
  18. linux xxd命令
  19. 林达华-和机器学习和计算机视觉相关的数学
  20. php redis 删除key 通配符,php redis 批量删除keys的方法

热门文章

  1. [RM HA 1] Cloudera CDH5 RM HA功能验证
  2. 如何让for循环中最后一次的输出和循环体的不一样
  3. FASTICA独立成分分析matlab代码实现
  4. Python学习笔记:错误和异常
  5. Hough Transform 的算法思想
  6. matlab 小技巧
  7. 云炬随笔20171205
  8. 云炬Android开发笔记 9主界面-通用底部导航设计与一键式封装
  9. 嵌入式linux开发课程设计,嵌入式Linux开发课程设计指导书
  10. VTK修炼之道79:交互与拾取_单位拾取