Android 中 RegistrantList消息处理机制 以android 5.0 MT为例
生活随笔
收集整理的這篇文章主要介紹了
Android 中 RegistrantList消息处理机制 以android 5.0 MT为例
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這其實是觀察者模式的一種實現形式
先明確兩個身份 1.RefistrantList 通知者 2.Registrant 觀察者,這是一個一對多的關系,在有事件更新時,凡是在名單上登記過的對象,都會收到通知。 RegistrantList通知者支持對通知者的增加(add/addUnique)刪除(remove),并且能夠發出通知(notifyRegitrants);而Registrant作為觀察者,響應通知者發出的notifyRegistrant通知,并由其internalNotifyRegistrants方法響應通知者發出的通知。 整體上這個消息注冊機制分為兩部分,消息注冊和消息通知。其總體思想是:一個對象中開辟一個空間用于存放Message,當調用regist方法時將Message存放進去,當其調用notify方法時將所有Message取出并發送到MessageQueue中等待處理。
下面我們以android 5.0上 來電流程為例講一下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() 獲得觀察者數量。
這個消息是一開始注冊為觀察者就攜帶進去的
<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> 至于響應通知做了什么工作不是這次的重點。
從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
先明確兩個身份 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为例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IDEA 快捷键 Android Stu
- 下一篇: Android-深入理解AIDL