Android 中 RegistrantList消息处理机制 以android 5.0 MT为例

来源:互联网 发布:安卓pad应用推荐 知乎 编辑:程序博客网 时间:2024/05/01 12:52
这其实是观察者模式的一种实现形式

先明确两个身份 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

0 0
原创粉丝点击