作為Android的四大元件之一,沒有理由不介紹一下BroadCast,BroadCast中文簡單翻譯就是廣播,前陣子浙江某大學的啦啦操,廣場舞的大媽,其中大媽和學生從喇叭和音響上聽到的聲音就是事件源,接收者就是這些大媽和學生,程式源自實踐,Android中BroadCast,有事件廣播者也有事件接收者,Broadcast是一種廣泛運用的在應用程式之間傳輸資訊的機制,BroadcastReceiver是對發送出來的 Broadcast進行過濾接受并響應的一類元件,也就是接收者。講完了基本的概念,可以開始基本的實踐:
兩種實作方式,一種是靜态,一種是動态,先看下靜态的實作過程:
定義一個BookBroadCast接收者(有幾個判斷添加是系統廣播需要的):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<code>public</code> <code>class</code> <code>BookBroadCast </code><code>extends</code> <code>BroadcastReceiver {</code>
<code> </code><code>private</code> <code>String tag = </code><code>"BookBroadCast"</code><code>;</code>
<code> </code><code>@Override</code>
<code> </code><code>public</code> <code>void</code> <code>onReceive(Context context, Intent intent) {</code>
<code> </code><code>// TODO Auto-generated method stub</code>
<code> </code><code>String actionString = intent.getAction();</code>
<code> </code><code>String name = intent.getStringExtra(</code><code>"Name"</code><code>);</code>
<code> </code><code>if</code> <code>(actionString.equals(Intent.ACTION_TIME_CHANGED)) {</code>
<code> </code><code>Log.i(tag, </code><code>"Name:"</code> <code>+ name + </code><code>"--Action:"</code> <code>+ actionString</code>
<code> </code><code>+ </code><code>"--哥們,時間改變了~"</code><code>);</code>
<code> </code><code>} </code><code>else</code> <code>if</code> <code>(actionString.equals(Intent.ACTION_BATTERY_CHANGED)) {</code>
<code> </code><code>+ </code><code>"--哥們,電量變了~"</code><code>);</code>
<code> </code><code>} </code><code>else</code> <code>{</code>
<code> </code><code>Log.i(tag, </code><code>"Name:"</code> <code>+ name + </code><code>"--Action:"</code> <code>+ actionString);</code>
<code> </code><code>}</code>
<code> </code><code>}</code>
<code>}</code>
看下App頁面:

靜态廣播對應第一個按鈕,點選事件:
<code>Intent intent = </code><code>new</code> <code>Intent(</code><code>"com.google.broadcast.BookBroadCast.static"</code><code>);</code>
<code> </code><code>intent.putExtra(</code><code>"Name"</code><code>, </code><code>"靜态廣播"</code><code>);</code>
<code> </code><code>sendBroadcast(intent);</code>
靜态廣播需要在AndroidManifest.xml中注冊一下:
<code><receiver android:name=</code><code>"com.google.broadcast.BookBroadCast"</code><code>></code>
<code> </code><code><intent-filter ></code>
<code> </code><code><action android:name=</code><code>"com.google.broadcast.BookBroadCast.static"</code><code>/></code>
<code> </code><code><action android:name=</code><code>"android.intent.action.TIME_SET"</code><code>/></code>
<code> </code><code></intent-filter></code>
<code> </code><code></receiver></code>
結果如下:
動态調用就是不需要在AndroidManifest.xml注冊,在程式中動态生成filter設定action,在activity中的onStart注冊,onStop終止:
<code>@Override</code>
<code>protected</code> <code>void</code> <code>onStop() {</code>
<code> </code><code>// TODO Auto-generated method stub</code>
<code> </code><code>super</code><code>.onStop();</code>
<code> </code><code>unregisterReceiver(bookReceiver);</code>
<code>protected</code> <code>void</code> <code>onStart() {</code>
<code> </code><code>super</code><code>.onStart();</code>
<code> </code><code>IntentFilter intentFilter = </code><code>new</code> <code>IntentFilter();</code>
<code> </code><code>intentFilter.addAction(</code><code>"com.google.broadcast.BookBroadCast.dymanic"</code><code>);</code>
<code> </code><code>bookReceiver = </code><code>new</code> <code>BookBroadCast();</code>
<code> </code><code>registerReceiver(bookReceiver, intentFilter);</code>
動态調用事件,對應第二個按鈕:
<code>Intent dintent = </code><code>new</code> <code>Intent(</code><code>"com.google.broadcast.BookBroadCast.dymanic"</code><code>);</code>
<code> </code><code>dintent.putExtra(</code><code>"Name"</code><code>, </code><code>"動态廣播"</code><code>);</code>
<code> </code><code>sendBroadcast(dintent);</code>
結果如下:
關于系統廣播的各種事件網上一找一堆,我就沒必要貼在這裡了,先來實作第三個和第四個按鈕的事件,第三個是系統事件的改變,第四個是電池電量的改變:
第三個action的常量的和Intent枚舉出來的名稱有出入:
<code><action android:name=</code><code>"android.intent.action.TIME_SET"</code><code>/></code>
調用的時候是這樣的:
<code>Intent sintent = </code><code>new</code> <code>Intent(Intent.ACTION_TIME_CHANGED);</code>
<code> </code><code>sintent.putExtra(</code><code>"Name"</code><code>, </code><code>"不被保護系統廣播"</code><code>);</code>
<code> </code><code>sendBroadcast(sintent);</code>
這個其實都沒有什麼大的問題,然後按照靜态注冊方式沒法搞定第四個電池電量的問題,先來看第四個是如何實作的:
<code>IntentFilter systemintentFilter = </code><code>new</code> <code>IntentFilter(Intent.ACTION_BATTERY_CHANGED);</code>
<code> </code><code>systembookReceiver = </code><code>new</code> <code>BookBroadCast();</code>
<code> </code><code>registerReceiver(systembookReceiver, systemintentFilter);</code>
首先可以看出不是靜态注冊的,需要動态注冊,然後不需要調用sendBroadcast,結果如下:
這個問題解決都弄了一個多小時,最終的Google的API找到對應的解釋:
位址:http://developer.android.com/reference/android/content/Intent.html#ACTION_TIME_TICK
本文轉自Fly_Elephant部落格園部落格,原文連結:http://www.cnblogs.com/xiaofeixiang/p/4083288.html,如需轉載請自行聯系原作者