Android中的廣播(BroadCast)詳細介紹
什么是廣播
在Android中,Broadcast是一種廣泛運用的在應(yīng)用程序之間傳輸信息的機制。我們拿廣播電臺來做個比方。我們平常使用收音機收音是這樣的:許許多多不同的廣播電臺通過特定的頻率來發(fā)送他們的內(nèi)容,而我們用戶只需要將頻率調(diào)成和廣播電臺的一樣就可以收聽他們的內(nèi)容了。Android中的廣播機制就和這個差不多的道理。
電臺發(fā)送的內(nèi)容是語音,而在Android中我們要發(fā)送的廣播內(nèi)容是一個Intent。這個Intent中可以攜帶我們要傳送的數(shù)據(jù)。
電臺通過大功率的發(fā)射器發(fā)送內(nèi)容,而在Android中則是通過sendBroadcast這個方法來發(fā)送(很形象的名字吧)。
用戶通過調(diào)整到具體的電臺頻率接受電臺的內(nèi)容。而在Android中要接受廣播中的內(nèi)容則是通過注冊一個BroadCastReceiver來接收的。只有發(fā)送廣播的action和接收廣播的action相同,接受者才能接受這個廣播。
廣播有什么用
其實,在什么是廣播的第一句就已經(jīng)說明了廣播有什么用了。對了,籠統(tǒng)一點講就是用來傳輸數(shù)據(jù)的。具體一點說就是: 1.實現(xiàn)了不同的程序之間的數(shù)據(jù)傳輸與共享,因為只要是和發(fā)送廣播的action相同的接受者都能接受這個廣播。典型的應(yīng)用就是android自帶的短信,電話等等廣播,只要我們實現(xiàn)了他們的action的廣播,那么我們就能接收他們的數(shù)據(jù)了,以便做出一些處理。比如說攔截系統(tǒng)短信,攔截騷擾電話等等 2.起到了一個通知的作用,比如在service中要通知主程序,更新主程序的UI等。因為service是沒有界面的,所以不能直接獲得主程序中的控件,這樣我們就只能在主程序中實現(xiàn)一個廣播接受者專門用來接受service發(fā)過來的數(shù)據(jù)和通知了。
實現(xiàn)廣播
現(xiàn)在我們就來實現(xiàn)一個簡單的廣播程序。Android提供了兩種注冊廣播接受者的形式,分別是在程序中動態(tài)注冊和在xml中指定。他們之間的區(qū)別就是作用的范圍不同,程序動態(tài)注冊的接收者只在程序運行過程中有效,而在xml注冊的接收者不管你的程序有沒有啟動有會起作用。首先介紹在程序中動態(tài)注冊的方式。
動態(tài)注冊方式
我們在程序中設(shè)置了三個按鈕,分別是“注冊廣播”,“取消注冊”和“發(fā)送廣播”。然后每個按鈕設(shè)置點擊事件來完成廣播的演示。
最簡單的項目的建立過程和按鈕事件的建立我再這里就不羅嗦了,不會的可以下載下面的DEMO源碼查看。直接看三個按鈕的實現(xiàn)方式。
首先是注冊廣播的按鈕事件代碼:
private ReceiveBroadCast receiveBroadCast; //廣播實例
public class RegisteLinster implements OnClickListener
{
@Override
public void onClick(View view)
{
// 注冊廣播接收
receiveBroadCast = new ReceiveBroadCast();
IntentFilter filter = new IntentFilter();
filter.addAction(flag); //只有持有相同的action的接受者才能接收此廣播
registerReceiver(receiveBroadCast, filter);
}
}
public class ReceiveBroadCast extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
//得到廣播中得到的數(shù)據(jù),并顯示出來
String message = intent.getStringExtra("data");
txtShow.setText(message);
}
}
首先我們實現(xiàn)了一個ReceiveBroadCast 類,它繼承了BroadcastReceiver并實現(xiàn)了其中的onReceive方法,這樣當這個廣播被接收的時候就會執(zhí)行這個方法。注意我們在注冊廣播的時候使用了filter.addAction方法添加了一個過濾器。如果沒有這一句,就相當于廣播電臺沒有告訴咱們收音機用戶接收的頻率,就不好收聽這個廣播了。
再來看看如何取消注冊,是的程序不再接收這個類型的廣播了。
public class UnregisteLinster implements OnClickListener
{
@Override
public void onClick(View arg0)
{
unregisterReceiver(receiveBroadCast);
}
}
怎么樣?是不是超級簡單的啊,就是將我們上面的那個廣播類的實例傳進去就行了?,F(xiàn)在注冊,取消注冊都好了,就剩下如何發(fā)送了??创a:
public class SendBroadCastListener implements OnClickListener
{
@Override
public void onClick(View arg0)
{
Intent intent = new Intent(); //Itent就是我們要發(fā)送的內(nèi)容
intent.putExtra("data", "this is data from broadcast "+Calendar.getInstance().get(Calendar.SECOND));
intent.setAction(flag); //設(shè)置你這個廣播的action,只有和這個action一樣的接受者才能接受者才能接收廣播
sendBroadcast(intent); //發(fā)送廣播
}
}
每一句都注釋了的,就不要我再講了吧。一看就明白了?,F(xiàn)在,運行程序看看效果吧。先注冊一下,然后每發(fā)送一次廣播上面的文字就會變化一次,表明已經(jīng)接收到了廣播了。按取消注冊后你可以發(fā)現(xiàn)再按發(fā)送按鈕已經(jīng)接收不到廣播了。
配置文件方式
配置和動態(tài)注冊的區(qū)別在上面已經(jīng)說了,這種方式適合你的程序需要長期的監(jiān)測某個廣播的情形,比如監(jiān)測用戶的短信。注冊方式比較簡單,相當于上面的代碼只要接收的那部分就行了。不過要注意的是通過配置文件這種方式注冊廣播需要在單獨的一個類中繼承BroadReceiver,內(nèi)部類是沒有用的。所以我們新建了一個broadCastReceiveByXml類并繼承了BroadReceive。代碼如下:
public class broadCastReceiveByXml extends BroadcastReceiver
{
@Override
public void onReceive(Context arg0, Intent arg1)
{
Log.d("qlf", "broadcast receive by xml"); //因為不在主UI下,不好使用控件,所以我們這里打印到LOG里面查看效果
}
}
然后在AndroidManifest中的<activity></activity>節(jié)點之后我們添加一下代碼:
<receiver android:name="com.qlf.broadCast.broadCastReceiveByXml">
<intent-filter>
<action android:name="com.qlf.broadCastFlag">
</action>
</intent-filter>
</receiver>
receiver中的android:name就是我們在程序中的那個接收廣播的類。下面的intent-filter和我們講到的功能類似,而這個action就是上面的那個flag啦?,F(xiàn)在我們運行程序,發(fā)現(xiàn)同樣可以實現(xiàn)上面的功能。運行的結(jié)果如下:
除了使用我們自己發(fā)送廣播,android也內(nèi)置了許多廣播。比如我們上面提到的來了消息的時候android會發(fā)送一個action名為“android.provider.Telephony.SMS_RECEIVED”的廣播,這個時候如果我們想要接受這個廣播只要將配置文件中的那個action設(shè)置為上面這個字符串就能接收到消息信息了。android包括了許多其他的廣播action,有興趣的同學(xué)到網(wǎng)上搜搜就有了。這里就不再舉例了。
- Android中BroadcastReceiver(異步接收廣播Intent)的使用
- Android提高之BroadcastReceiver實例詳解
- 深入Android中BroadcastReceiver的兩種注冊方式(靜態(tài)和動態(tài))詳解
- Android編程四大組件之BroadcastReceiver(廣播接收者)用法實例
- Android查看電池電量的方法(基于BroadcastReceiver)
- Android使用廣播(BroadCast)實現(xiàn)強制下線的方法
- Android實現(xiàn)Activity、Service與Broadcaster三大組件之間互相調(diào)用的方法詳解
- Android開發(fā)之BroadcastReceiver用法實例分析
- Android基礎(chǔ)知識之broadcast廣播詳解
- Android學(xué)習(xí)之Broadcast的簡單使用
相關(guān)文章
Android開發(fā)之AlertDialog實現(xiàn)彈出對話框
這篇文章主要為大家詳細介紹了Android開發(fā)之AlertDialog實現(xiàn)彈出對話框,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-09-09Android RecyclerView詳解之實現(xiàn) ListView GridView瀑布流效果
RecyclerView 是Android L版本中新添加的一個用來取代ListView的SDK,它的靈活性與可替代性比listview更好2016-07-07Flutter自定義實現(xiàn)神奇動效的卡片切換視圖的示例代碼
這篇文章主要介紹了Flutter自定義實現(xiàn)神奇動效的卡片切換視圖的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04Android 沉浸式狀態(tài)欄與隱藏導(dǎo)航欄實例詳解
沉浸式狀態(tài)欄是指狀態(tài)欄與ActionBar顏色相匹配,隱藏導(dǎo)航欄,就是將導(dǎo)航欄隱藏,去掉下面的黑條。下面通過實例給大家詳解android沉浸式狀態(tài)欄與隱藏導(dǎo)航欄,感興趣的朋友一起看看2017-07-07發(fā)布?Android?library?到?Maven?解析
這篇文章主要介紹了發(fā)布?Android?library到Maven解析,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09Android開發(fā)之多線程中實現(xiàn)利用自定義控件繪制小球并完成小球自動下落功能實例
這篇文章主要介紹了Android開發(fā)之多線程中實現(xiàn)利用自定義控件繪制小球并完成小球自動下落功能的方法,涉及Android多線程編程及圖形繪制相關(guān)技巧,需要的朋友可以參考下2015-12-12