標籤:android style blog http io ar os java sp
作為Android的四大組件之一,沒有理由不介紹一下BroadCast,BroadCast中文簡單翻譯就是廣播,前陣子浙江某大學的啦啦操,廣場舞的大媽,其中大媽和學生從喇叭和音響上聽到的聲音就是事件來源,接收者就是這些大媽和學生,程式源自實踐,Android中BroadCast,有事件廣播者也有事件接收者,Broadcast是一種廣泛運用的在應用程式之間傳輸資訊的機制,BroadcastReceiver是對發送出來的 Broadcast進行過濾接受並響應的一類組件,也就是接收者。講完了基本的概念,可以開始基本的實踐:
自訂廣播的兩種實現方式
兩種實現方式,一種是靜態,一種是動態,先看下靜態實現過程:
定義一個BookBroadCast接收者(有幾個判斷添加是系統廣播需要的):
public class BookBroadCast extends BroadcastReceiver {private String tag = "BookBroadCast";@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubString actionString = intent.getAction();String name = intent.getStringExtra("Name");if (actionString.equals(Intent.ACTION_TIME_CHANGED)) {Log.i(tag, "Name:" + name + "--Action:" + actionString+ "--哥們,時間改變了~");} else if (actionString.equals(Intent.ACTION_BATTERY_CHANGED)) {Log.i(tag, "Name:" + name + "--Action:" + actionString+ "--哥們,電量變了~");} else {Log.i(tag, "Name:" + name + "--Action:" + actionString);}}}
看下App頁面:
靜態廣播對應第一個按鈕,點擊事件:
Intent intent = new Intent("com.google.broadcast.BookBroadCast.static");intent.putExtra("Name", "靜態廣播");sendBroadcast(intent);
靜態廣播需要在AndroidManifest.xml中註冊一下:
<receiver android:name="com.google.broadcast.BookBroadCast"> <intent-filter > <action android:name="com.google.broadcast.BookBroadCast.static"/> <action android:name="android.intent.action.TIME_SET"/> </intent-filter> </receiver>
結果如下:
動態調用就是不需要在AndroidManifest.xml註冊,在程式中動態產生filter設定action,在activity中的onStart註冊,onStop終止:
@Overrideprotected void onStop() {// TODO Auto-generated method stubsuper.onStop();unregisterReceiver(bookReceiver);}@Overrideprotected void onStart() {// TODO Auto-generated method stubsuper.onStart();IntentFilter intentFilter = new IntentFilter();intentFilter.addAction("com.google.broadcast.BookBroadCast.dymanic");bookReceiver = new BookBroadCast();registerReceiver(bookReceiver, intentFilter);}
動態呼叫事件,對應第二個按鈕:
Intent dintent = new Intent("com.google.broadcast.BookBroadCast.dymanic");dintent.putExtra("Name", "動態廣播");sendBroadcast(dintent);
結果如下:
兩種系統廣播調用方式
關於系統廣播的各種事件網上一找一堆,我就沒必要貼在這裡了,先來實現第三個和第四個按鈕的事件,第三個是系統事件的改變,第四個是電池電量的改變:
第三個action的常量的和Intent枚舉出來的名稱有出入:
<action android:name="android.intent.action.TIME_SET"/>
調用的時候是這樣的:
Intent sintent = new Intent(Intent.ACTION_TIME_CHANGED);sintent.putExtra("Name", "不被保護系統廣播");sendBroadcast(sintent);
結果如下:
這個其實都沒有什麼大的問題,然後按照靜態註冊方式沒法搞定第四個電池電量的問題,先來看第四個是如何?的:
IntentFilter systemintentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);systembookReceiver = new BookBroadCast();registerReceiver(systembookReceiver, systemintentFilter);
首先可以看出不是靜態註冊的,需要動態註冊,然後不需要調用sendBroadcast,結果如下:
這個問題解決都高了一個多小時,最終的Google的API找到對應的解釋:
地址:http://developer.android.com/reference/android/content/Intent.html#ACTION_TIME_TICK
遇到問題發現Google才是最可靠的,也搜了不少中文文章,就不信沒人遇到坑,哎,周六看部落格的都是愛學習的孩子,周末愉快~
Android組件之BroadCast簡單實踐