国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

BroadcastReceiver廣播相關API和說明

2019-11-08 00:18:31
字體:
來源:轉載
供稿:網友

本文作者:Hensen_

Hensen_的博客地址:

http://blog.csdn.net/QQ_30379689

本篇文章包括以下內容:

前言BroadcastReceiver的簡介普通廣播(自定義廣播)有序廣播攔截廣播本地廣播Sticky廣播系統廣播部分源碼下載

前言

又是一篇基礎總結性的文章來啦,個人強迫癥犯了,非得把博客的四大組件模塊給補齊了,總結了一下BoradcastReceiver的各種使用,廢話不多說,開車啦。博主建議自己敲一遍代碼來理解廣播,因為里面有很多細節的東西需要注意,在學習中博主也犯過一些低級錯誤,不然以后到大項目中,不牢牢掌握好基礎,會浪費很多時間在這上面。或者認真閱讀本篇文章內容

BroadcastReceiver的簡介

BroadcastReceiver翻譯為廣播接收者,Broadcast是一種廣泛運用在應用程序之間的傳輸信息的機制,簡單的可以理解為傳統意義上的電臺廣播,通俗一點,發布失物招領

廣播機制是一個典型的發布—訂閱模式,也就是我們所說的觀察者模式。廣播最大的特點就是發送方并不關心接收方是否接到數據,也不關心接收方是如何處理數據的,通過這樣的形式來達到接、收雙方的完全解耦合

普通廣播(自定義廣播)

普通廣播是完全異步的,通過Context的sendBroadcast()方法來發送,消息傳遞效率比較高,但所有receivers(接收器)的執行順序不確定。缺點是:接收者不能將處理結果傳遞給下一個接收者,并且無法終止廣播Intent的傳播,直到沒有與之匹配的廣播接收器為止。下面以自定義的普通廣播進行演示

一、創建廣播

創建廣播非常簡單,只要繼承BroadcastReceiver并實現onReceive()方法

public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.e("receive","onReceive"); }}123456123456

二、注冊廣播

BroadcastReceiver是四大組件之一,所以毫不疑問需要注冊,BroadcastReceiver的注冊有兩種方法:

通過manifests配置通過代碼動態配置

方法一:通過manifests配置

<receiver android:name=".BroadcastReceiver.MyBroadcastReceiver"> <intent-filter> <action android:name="com.handsome.hensen" /> </intent-filter></receiver>1234512345

這里需要加入intent-filter的action中的name屬性,表示我們監聽的內容。當有廣播發送時,需要判斷該廣播是否和我們監聽的內容一致,如果一致則接收

方法二:通過代碼動態配置

//創建廣播MyBroadcastReceiver receiver = new MyBroadcastReceiver();//注冊廣播registerReceiver(receiver, new IntentFilter("com.handsome.hensen"));12341234

三、反注冊廣播

BroadcastReceiver必須遵循生到死的周期,如果你是使用動態注冊廣播的則需要在Activity的onDestroy的時候反注冊廣播

@OverridePRotected void onDestroy() { unregisterReceiver(receiver); super.onDestroy();}1234512345

四、發送廣播

這里我們以一個按鈕來發送廣播,通過sendBroadcast()方法發送我們的創建的Intent自定義廣播

final Intent intent = new Intent();//廣播內容intent.setAction("com.handsome.hensen");bt_send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sendBroadcast(intent); }});1234567891012345678910

五、運行代碼

運行程序后,我們點擊發送廣播。我們以Log信息來驗證發出的廣播被我們準確的接收

11-25 10:27:43.341 5188-5188/com.handsome.boke2 E/receive: onReceive11

有序廣播

有序廣播通過Context.sendOrderedBroadcast()來發送,所有的廣播接收器優先級依次執行,廣播接收器的優先級通過receiver的intent-filter中的Android:priority屬性來設置,數值越大優先級越高。

當廣播接收器接收到廣播后,可以使用setResult()函數來結果傳給下一個廣播接收器接收,然后通過getResult()函數來取得上個廣播接收器接收返回的結果。當廣播接收器接收到廣播后,也可以用abortBroadcast()函數來讓系統攔截下來該廣播,并將該廣播丟棄,使該廣播不再傳送到別的廣播接收器接收

一、創建廣播

我們創建一個類,存放三個有優先級的廣播接收者,并在最高級廣播中傳遞結果到下一個廣播

public class PriorityBroadcastReceiver { public static class HighPriority extends BroadcastReceiver { //高級廣播接收者 @Override public void onReceive(Context context, Intent intent) { Log.e("receive", "High"); //傳遞結果到下一個廣播接收器 int code = 0; String data = "hello"; Bundle bundle = null; setResult(code, data, bundle); } } public static class MidPriority extends BroadcastReceiver { //中級廣播接收者 @Override public void onReceive(Context context, Intent intent) { Log.e("receive", "Mid"); //獲取上一個廣播接收器結果 int code = getResultCode(); String data = getResultData(); Log.e("receive", "獲取到上一個廣播接收器結果:" + "code=" + code + "data=" + data); } } public static class LowPriority extends BroadcastReceiver { //低級廣播接收者 @Override public void onReceive(Context context, Intent intent) { Log.e("receive", "Low"); } }}12345678910111213141516171819202122232425262728293031323334351234567891011121314151617181920212223242526272829303132333435

要注意的是:

內部類的BroadcastReceiver必須由public static修飾,否則會報錯

二、注冊廣播

這里的注冊方式和普通廣播是一樣的,這里的區別在于priority屬性,確定了他們之間的優先級

<receiver android:name=".BroadcastReceiver.PriorityBroadcastReceiver$HighPriority"> <intent-filter android:priority="3000"> <action android:name="com.handsome.hensen2" /> </intent-filter></receiver><receiver android:name=".BroadcastReceiver.PriorityBroadcastReceiver$MidPriority"> <intent-filter android:priority="2000"> <action android:name="com.handsome.hensen2" /> </intent-filter></receiver><receiver android:name=".BroadcastReceiver.PriorityBroadcastReceiver$LowPriority"> <intent-filter android:priority="1000"> <action android:name="com.handsome.hensen2" /> </intent-filter></receiver>123456789101112131415123456789101112131415

要注意的是:

BroadcastReceiver類名與內部類的名字之間用$符號隔開,否則會報錯

三、發送廣播

和之前的不一樣的地方,這里是使用sendOrderedBroadcast()發送有序廣播

final Intent intent = new Intent();intent.setAction("com.handsome.hensen2");bt_send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sendOrderedBroadcast(intent,null); }});123456789123456789

要注意的是:

這里需要發送的是有序廣播,否則在接收者中通過setResult()和getResult()方法會報錯,因為只有有序廣播才能傳遞結果

四、運行代碼

運行程序后,我們點擊發送廣播。我們以Log信息來驗證發出的廣播被我們準確的接收,數據被我們準確的傳遞

11-25 11:50:07.207 12777-12777/com.handsome.boke2 E/receive: High11-25 11:50:07.217 12777-12777/com.handsome.boke2 E/receive: Mid11-25 11:50:07.218 12777-12777/com.handsome.boke2 E/receive: 獲取到上一個廣播接收器結果:code=0data=hello11-25 11:50:07.233 12777-12777/com.handsome.boke2 E/receive: Low12341234

攔截廣播

上面我們提到過有序廣播中可以攔截廣播,那么我們在上面程序的基礎上修改代碼,在HighPriority接收器中加上攔截廣播

一、創建廣播

通過在BroadcastReceiver中,執行abortBroadcast()方法,廣播就不會繼續往下傳遞了

public static class HighPriority extends BroadcastReceiver { //高級廣播接收者 @Override public void onReceive(Context context, Intent intent) { Log.e("receive", "High"); //攔截廣播 abortBroadcast(); //傳遞結果到下一個廣播接收器 int code = 0; String data = "hello"; Bundle bundle = null; setResult(code, data, bundle); } }12345678910111213141234567891011121314

二、運行代碼

運行程序后,我們點擊發送廣播。我們以Log信息來驗證我們攔截了廣播

11-25 12:12:36.405 30867-30867/com.handsome.boke2 E/receive: High11

可以看到,后面的Mid和Low廣播都沒有Log信息,說明我們攔截成功了

三、有序廣播、攔截廣播的拓展——終結廣播

現在有這樣的一個應用場景,按照上面的程序走,只能在第一個廣播中被攔截住了,后面的廣播則不執行。如果這個時候我們需要一個不管有沒有被攔截都必須執行的廣播,我們稱為終結廣播,那應該怎么辦。同樣的,發送有序廣播也考慮到這一點,通過以下代碼來發送廣播,并指定我們不管有沒有被攔截都必須執行的終結廣播

bt_send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sendOrderedBroadcast(intent, null, new PriorityBroadcastReceiver.LowPriority(), new Handler(), 0, null, null); }});12345671234567

運行代碼,我們查看Log信息

11-25 12:22:33.466 4764-4764/com.handsome.boke2 E/receive: High11-25 12:22:33.468 4764-4764/com.handsome.boke2 E/receive: Low1212

可以發現,之前只是有High的Log信息,因為是被攔截了,而Log信息多了一條Low,說明我們攔截后,還要執行終結廣播

本地廣播

在API21的Support v4包中新增本地廣播,也就是LocalBroadcastManager。由于之前的廣播都是全局的,所有應用程序都可以接收到,這樣就會帶來安全隱患,所以我們使用LocalBroadcastManager只發送給自己應用內的信息廣播,限制在進程內使用

它的用法很簡單,只需要把調用context的sendBroadcast、registerReceiver、unregisterReceiver的地方換為LocalBroadcastManager.getInstance(Context context)中對應的函數即可。這里創建廣播的過程和普通廣播是一樣的過程,這里就不過多介紹了

一、注冊Receiver

//創建廣播receiver = new MyBroadcastReceiver();//注冊本地廣播LocalBroadcastManager.getInstance(ReceiverActivity.this).registerReceiver(receiver, new IntentFilter("com.handsome.hensen"));1234512345

二、反注冊Receiver

LocalBroadcastManager.getInstance(ReceiverActivity.this).unregisterReceiver(receiver);11

三、發送異步廣播

final Intent intent = new Intent();intent.setAction("com.handsome.hensen2");LocalBroadcastManager.getInstance(ReceiverActivity.this).sendBroadcast(intent);123123

四、發送同步廣播

LocalBroadcastManager.getInstance(ReceiverActivity.this).sendBroadcastSync(intent);11

Sticky廣播

sticky廣播通過Context.sendStickyBroadcast()函數來發送,用此函數發送的廣播會一直滯留,當有匹配此廣播的廣播接收器被注冊后,該廣播接收器就會收到此條信息。使用此函數需要發送廣播時,需要獲得BROADCAST_STICKY權限

<uses-permission android:name="android.permission.BROADCAST_STICKY"/>11

sendStickyBroadcast只保留最后一條廣播,并且一直保留下去,這樣即使已經有廣播接收器處理了該廣播,當再有匹配的廣播接收器被注冊時,此廣播仍會被接收。如果你只想處理一遍該廣播,可以通過removeStickyBroadcast()函數來實現。這里創建廣播的過程和普通廣播是一樣的過程,這里就不過多介紹了

系統廣播

當然系統中也會有很多自帶的廣播,當符合一定條件時,系統會發送一些定義好的廣播,比如:重啟、充電、來電電話等等。我們可以通過action屬性來監聽我們的系統廣播

<receiver android:name=".BroadcastReceiver.MyBroadcastReceiver"> <intent-filter> <!--重啟設備--> <action android:name="android.intent.action.REBOOT" /> </intent-filter></receiver>123456123456

這里創建廣播的過程和普通廣播是一樣的過程,這里就不過多介紹了。常用的廣播action屬性有

屏幕被關閉之后的廣播:Intent.ACTION_SCREEN_OFF屏幕被打開之后的廣播:Intent.ACTION_SCREEN_ON充電狀態,或者電池的電量發生變化:Intent.ACTION_BATTERY_CHANGED關閉或打開飛行模式時的廣播:Intent.ACTION_AIRPLANE_MODE_CHANGED表示電池電量低:Intent.ACTION_BATTERY_LOW表示電池電量充足,即電池電量飽滿時會發出廣播:Intent.ACTION_BATTERY_OKAY按下照相時的拍照按鍵(硬件按鍵)時發出的廣播:Intent.ACTION_CAMERA_BUTTON
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 观塘区| 历史| 禄丰县| 海盐县| 南充市| 彰化市| 铁岭县| 信丰县| 鄂尔多斯市| 两当县| 大关县| 承德市| 永兴县| 二连浩特市| 墨竹工卡县| 米易县| 德昌县| 天祝| 岳池县| 垫江县| 马尔康县| 武威市| 高雄县| 黄龙县| 神池县| 弥勒县| 泾川县| 百色市| 兴国县| 江川县| 类乌齐县| 栾川县| 布拖县| 沙湾县| 三亚市| 五峰| 化州市| 满洲里市| 江口县| 文成县| 乌拉特中旗|