Android组件之BroadCast简单实践
作為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简单实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通过案例学调优之--SQL Profil
- 下一篇: Android 中文 API —— T