使用廣播-BroadcastReceiver最詳細解析
- 女孩:BroadcastReceiver是什麼呀?
- 男孩:Broadcast是廣播的意思,在Android中應用程式之間的傳輸資訊的機制,BroadcastReceiver是接收廣播通知的元件,廣播和廣播接收器是Android中需要了解的,那麼怎麼樣去了解呢~
廣播,大家應該可以理解,我們在學校做眼保健操時,就有個廣播,告訴我們要做眼保健操了。廣播傳遞資訊告訴我們要做什麼,通知資訊或傳遞資料等。廣播接收器是用來接收來自系統和應用的廣播。
在Android中提供了兩種主要的型別廣播:標準廣播和有序廣播。
什麼是廣播呢?在手機的訊息提示框,對話方塊或通知的形式告訴我們,如我們手機沒電了,會彈出提示,接收簡訊彈出提示等。而Broadcast Receiver為廣播接收器,是接收廣播的元件。
- 女孩:那麼哥,什麼是普通廣播和有序廣播?
- 男孩:額,在這裡你要了解一下普通廣播和有序廣播,主要講一下。~
普通廣播:
Normal broadcasts,是一種完全非同步執行的廣播,當廣播發出後,幾乎所有廣播接收器都會在同一時間收到這條廣播。如下圖:
這相當於有人在廣播室裡,播放做眼保健操的資訊,一同發出到每個教室一樣,沒有先後順序之分,對於普通廣播是無法終止廣播的傳播,一旦傳送,無法截斷其中一條,幾乎被所有接受者收到,而我們做眼保健操的就是接受者了。對於普通廣播,在Android中使用Context.sendBroadcast()方法來傳送。
有序廣播:
有序廣播,Ordered broadcasts,是一種同步執行的廣播,廣播發出後,只會有一個廣播接收器能接收到廣播訊息,當這個廣播接收器接收到後,廣播才會繼承傳遞,對於有序廣播有了先後順序,在Android中提供了優先順序的屬性(priority)來控制先後,有序廣播中可以截斷廣播,不被下一個廣播接收器接收,這是有序廣播的特點。
在這裡你瞭解了普通廣播和有序廣播的原理,這兩種其實就是廣播的接收的不同表現形式而已。
BroadcastReceiver的實現:
到頭來還是要了解BroadcastReceiver的實現,接下來我列出主要的內容目錄,對於廣播接收器是我們要掌握的,是Android中重要的四大元件之一。
接收系統廣播
你或許會問一下什麼又是系統廣播,對於掌握手機概念的,應用懂得系統,如:電池電量低,傳送系統廣播訊息;安裝新應用,廣播安裝資訊等。
廣播註冊分動態和靜態兩種:
動態註冊,需要繼承BroadcastReceiver的,並重寫onCreate()方法,和onReceive()方法,在onReceive()方法中,要例項接收器和IntentFilter例項。接著繼續重寫onDestroy()方法,加入unregisterReceiver()方法來實現取消註冊。
在動態註冊的廣播接收器中最後一定要取消註冊。
簡化:
重寫onCreate()
重寫onDestroy()
extends BroadcastReceiver
重寫onReceive()
靜態註冊,只要在配置檔案中修改程式碼即可,在AndroidManifest.xml檔案中:
<receiver android:name=包名.類名>
<intent-filter>
<action android:name="傳送的廣播"
</intent-filter>
</receiver>
這裡補充說一個自定義的廣播接受者
步驟:同樣
- 繼承BroadcastReceiver基類
- 複寫抽象方法onReceive()方法
以上為傳送普通廣播的實現形式,那麼你還記得一個有序廣播嗎?對於有序廣播的形式很簡單,也是和普通廣播一樣實現。只在傳送有差異而已。
有序廣播和普通廣播差異:只要修改普通廣播中sendBroadcast()方法,改成sendOrderedBroadcast()方法即可,你會覺得難記嗎?
廣播接收器(Broadcast Reveiver)
標準廣播(Normal broadcasts)
有序廣播(Ordered broadcasts)
這裡說一下,我把標準廣播說錯成標準廣播了,其實這裡標準和普通隨意叫吧,不過為了顯示技術牛逼,在外人前儘量說標準廣播吧。ok?
使用本地廣播:
什麼又是本地廣播呢?你會問道,本地廣播是Android引入的一套機制,為本地廣播機制,使用本地廣播機制,有很多優點:
- 不用但系機密資料被洩漏;
- 不用擔心安全漏洞的隱患;
- 更加高效。
在介紹本地廣播之前,前面講的廣播室一種全域性的,屬於系統全域性廣播,廣播室一個全域性的監聽器,在Android中,我們要知道廣播有兩種說法:廣播傳送者和廣播接收者。
在本地廣播重點說明:本地廣播沒有靜態註冊的方式,靜態註冊是為了程式在未啟動前也能收到廣播,而傳送本地廣播時,我們的程式是已開啟了的。
- 女孩:哥,講的差不多了,已經掌握了,不過可以寫一些程式碼例子嗎?
- 男孩:嗯,可以,掌握就牛逼了~
程式碼示例:
// 繼承BroadcastReceivre基類
public class MyBroadcastReceiver extends BroadcastReceiver {
// 複寫onReceive()方法
@Override
public void onReceive(Context context, Intent intent) {
//寫入接收廣播後的操作
}
}
示例動態註冊:
private IntentFilter intentFilter;
private MyReceiver myReceiver;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
myReceiver = new MyReceiver();
registerReceiver(myReceiver, intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(myReceiver);
}
示例靜態註冊:
<receiver android:name=".包名" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
最後都要加許可權:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
傳送自定義廣播:
Intent intent = new Intent("com.example.dashu.MY_BROADCAST");
//指明要傳送的廣播值
sendBroadcast(intent);
傳送有序廣播:
//sendOrderedBroadcast()方法
Intent intent = new Intent("com.example.dashu.MY_BROADCAST");
//指明要傳送的廣播值
sendOrderBroadcast(intent,null);
<intent-filter android:priority="100">
...
</intent-filter>
//優先順序
abortBroadcast();
//截斷
本地廣播:
localBroadcastManager = LocalBroadcastManager.getInstance(this);
//獲取例項
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.....");
myReceriver = new MyReceriver();
localBroadcastManager.registerReceiver(myReceriver, intentFilter);
Intent intent = new Intent("com...");
localBroadcastManager.sendBroadcast(intent);
//傳送本地廣播
localBroadcastManager.unregisterReceiver(myReceiver);
總結
有關內容就到這裡了,本篇介紹了四大元件中的廣播元件的知識點。
小禮物走一走 or 點贊
相關文章
- Android BroadcastReceiver(廣播)AndroidAST
- Android - BroadcastReceiver 廣播AndroidAST
- 用廣播 BroadcastReceiver 更新 UI 介面真的好嗎?全方位解析廣播ASTUI
- Semaphore最詳細解析
- Android BroadcastReceiver使用詳解AndroidAST
- 解析原生IP和廣播IP
- RxLifecycle詳細解析
- 廣播基礎使用
- CoreLocation框架詳細解析框架
- BLE廣播通道空中包詳解
- Git使用教程:最詳細、最傻瓜、最淺顯、真正手把手教!Git
- Android中的廣播使用Android
- 最詳細STL(一)vector
- 最新Java筆試題分享,我見過最詳細的Redis解析Java筆試Redis
- Android UI——SpannableString詳細解析AndroidUI
- Hadoop Yarn框架詳細解析HadoopYarn框架
- scala模式匹配詳細解析模式
- MySQL:排序(filesort)詳細解析MySql排序
- openstack完整的部署(最詳細)
- 全網最詳細4W字Flink全面解析與實踐(下)
- ChatGPT最詳細註冊教程+不註冊直接使用教程ChatGPT
- 藍芽Beacon廣播資料包格式以及解析藍芽
- linux命令yum的詳細解析Linux
- 網址(URL)的詳細解析
- 超詳細 DNS 協議解析DNS協議
- MyBatis詳細原始碼解析(上篇)MyBatis原始碼
- Java-全網最詳細反射Java反射
- 最詳細的spring(IOC、AOP)教程Spring
- 全網最詳細最齊全的序列化技術及深度解析與應用實戰
- 廣播接收器——接收系統廣播
- 《球球大作戰》原始碼解析(8):訊息廣播原始碼
- 【原始碼解析】- ArrayList原始碼解析,絕對詳細原始碼
- 超詳細SAP HANA JOB全解析
- PE檔案格式詳細解析(一)
- SAP 中利潤中心 詳細解析
- 關於SAP clienyt copy詳細解析
- OpenIddict 登入及詳細流程解析
- MySQL索引機制(詳細+原理+解析)MySql索引