天天看點

Android元件之BroadCast簡單實踐

作為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頁面:

Android元件之BroadCast簡單實踐

靜态廣播對應第一個按鈕,點選事件:

<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>&lt;receiver android:name=</code><code>"com.google.broadcast.BookBroadCast"</code><code>&gt;</code>

<code>         </code><code>&lt;intent-filter &gt;</code>

<code>             </code><code>&lt;action android:name=</code><code>"com.google.broadcast.BookBroadCast.static"</code><code>/&gt;</code>

<code>                </code><code>&lt;action android:name=</code><code>"android.intent.action.TIME_SET"</code><code>/&gt;</code>

<code>         </code><code>&lt;/intent-filter&gt;</code>

<code>     </code><code>&lt;/receiver&gt;</code>

  結果如下:

Android元件之BroadCast簡單實踐

動态調用就是不需要在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>

  結果如下:

Android元件之BroadCast簡單實踐

關于系統廣播的各種事件網上一找一堆,我就沒必要貼在這裡了,先來實作第三個和第四個按鈕的事件,第三個是系統事件的改變,第四個是電池電量的改變:

第三個action的常量的和Intent枚舉出來的名稱有出入:

<code>&lt;action android:name=</code><code>"android.intent.action.TIME_SET"</code><code>/&gt;</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>

Android元件之BroadCast簡單實踐

這個其實都沒有什麼大的問題,然後按照靜态注冊方式沒法搞定第四個電池電量的問題,先來看第四個是如何實作的:

<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,結果如下:

Android元件之BroadCast簡單實踐

這個問題解決都弄了一個多小時,最終的Google的API找到對應的解釋:

位址:http://developer.android.com/reference/android/content/Intent.html#ACTION_TIME_TICK

Android元件之BroadCast簡單實踐

本文轉自Fly_Elephant部落格園部落格,原文連結:http://www.cnblogs.com/xiaofeixiang/p/4083288.html,如需轉載請自行聯系原作者

繼續閱讀