日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【转】Android BroadcastReceiver介绍

發布時間:2025/3/20 Android 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】Android BroadcastReceiver介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文主要介紹BroadcastReceiver的概念、使用、生命周期、安全性、分類、特殊的BroadcastReceiver(本地、粘性、有序、粘性有序廣播)。
示例代碼見BroadcastReceiverDemo,示例APK見:TrineaAndroidDemo.apk。

?

1、概念介紹及兩種注冊方式的區別

BroadcastReceiver作為Android四大組件之一,不像Activity,沒有可顯示的界面。BroadcastReceiver包括兩個概念,廣播發送者和廣播接收者(Receiver),這里的廣播實際就是指Intent,程序可以自己發送廣播自己接收,也可以接受系統或其他應用的廣播或是發送廣播給其他應用程序。

發送者可以通過類似Context.sendBroadcast接口發送廣播,接收者通過Context.registerReceiver()動態注冊或在AndroidManifest.xml文件中通過<receiver>標簽靜態注冊,注冊完成后,當發送者發送某個廣播時系統會將發送的廣播(Intent)與系統中所有注冊的符合條件的接收者(Receiver)?的IntentFilter進行匹配,若匹配成功則執行相應接收者的onReceive函數,匹配規則見Intent和IntentFilter的匹配規則。

關于registerReceiver動態注冊和通過<receiver>標簽靜態注冊廣播的區別如下:

a.對bindService的調用,<receiver>注冊的廣播,在onReceive結束后廣播即不存在,所以不能在其中給自己異步傳遞結果,如bindService而只能使用startService,如果想跟service交互可使用peekService。

b. 手動控制。registerReceiver為動態注冊,自己可以手動注冊或是取消注冊;<receiver>標簽為靜態注冊,由系統開機時自動掃描注冊,所以無法手動控制,開機一直運行中。

c. 資源消耗不同。registerReceiver可以手動控制,所以適當的注冊和取消注冊能節省系統資源,<receiver>標簽系統開機后一直有效。

d. 有效期不同。通過registerReceiver注冊的BroadcastReceiver在對其進行注冊的Context對象"銷毀"了或者調用了unregisterReceiver方法時也就失效了,而通過<receiver>標簽注冊的BroadcastReceiver只要應用程序沒有被刪除就一直有效。

e. 對registerReceiver函數的調用許可不同。通過registerReceiver注冊的BroadcastReceiver在其onReceive函數中可以再次調用某個Context的registerReceiver函數,而通過<receiver>標簽注冊的BroadcastReceiver不允許再調用某個Context的registerReceiver函數?。

f. 使用情況不同。對于自己發送和接受的廣播可以通過registerReceiver注冊,對于系統常用廣播的接收通常用<receiver>標簽注冊。

?

2、使用舉例

BroadcastReceiverDemo

R.layout.broadcast_receiver_demo的內容為一個簡單的id為sendBroadcast的Button?

從上面代碼可以看到我們

a. 新建BroadcastReceiver只需要繼承BroadcastReceiver并重寫OnReceiver函數,加上自己的處理邏輯。

b. 通過registerReceiver注冊廣播,通過unregisterReceiver取消注冊廣播,通過sendBroadcast發送廣播。

其中注冊和取消注冊廣播放在了OnResume和OnPause函數中可以有效的節省系統消耗。如果希望廣播一直運行中可以在Activity的OnCreate函數中注冊,在OnDestrory函數中取消注冊。

這里的MyBroadcastReceiver也可以在AndroidManifest.xml文件中靜態注冊,這樣程序安裝后便一直運行中。比如希望接收到短信到來時的廣播,如下:

<receiver android:name="MyBroadcastReceiver"><intent-filter><action android:name="android.provider.Telephony.SMS_RECEIVED" /></intent-filter> </receiver>

?

3、生命周期

BroadcastReceiver在onReceive函數執行結束后即表示生命周期結束,所以不適合在onReceive中做綁定服務操作,結束后若某個進程只含有該BroadcastReceiver,則優先級將降低可能被系統回收,所以BroadcastReceiver中不適合做一些異步操作,如新建線程下載數據,BroadcastReceiver結束后可能在異步操作完成前進程已經被系統kill。

同時由于ANR限制BroadcastReceiver的onReceive函數必須在10秒內完成,而且onReceive默認會在主線程中執行,所以BroadcastReceiver中不適合做一些耗時操作,對于耗時操作需要交給service處理,比如網絡或數據庫耗時操作、對話框的顯示(因為現實時間可能超時,用Notification代替)。

?

4、安全性

BroadcastReceiver的設計初衷就是從全局考慮的,可以方便應用程序和系統、應用程序之間、應用程序內的通信,所以對單個應用程序而言BroadcastReceiver是存在安全性問題的,相應問題及解決如下:

a、當應用程序發送某個廣播時系統會將發送的Intent與系統中所有注冊的BroadcastReceiver的IntentFilter進行匹配,若匹配成功則執行相應的onReceive函數??梢酝ㄟ^類似sendBroadcast(Intent, String)的接口在發送廣播時指定接收者必須具備的permission?;蛲ㄟ^Intent.setPackage設置廣播僅對某個程序有效。

?

b. 當應用程序注冊了某個廣播時,即便設置了IntentFilter還是會接收到來自其他應用程序的廣播進行匹配判斷。對于動態注冊的廣播可以通過類似registerReceiver(BroadcastReceiver, IntentFilter, String, android.os.Handler)的接口指定發送者必須具備的permission,對于靜態注冊的廣播可以通過android:exported="false"屬性表示接收者對外部應用程序不可用,即不接受來自外部的廣播。

?

c.上面兩個問題其實都可以通過LocalBroadcastManager來解決,LocalBroadcastManager只會將廣播限定在當前應用程序中,具體見下面6特殊的BroadcastReceiver中的介紹

?

d.使用android:protectionLevel

?

5、分類

BroadcastReceiver可以分為普通和有序兩種,下面6特殊BroadcastReceiver中介紹了其他一些種類。

通過Context.sendBroadcast發送的廣播即為普通廣播,對于普通廣播接收者接收到它的順序是不定的,所以接收者接收到后無法使用其他接收者對它的處理結果也無法停止它。

?

通過Context.sendOrderedBroadcast發送的廣播即為有序廣播,與普通廣播的不同在于,接收者是有序接收到廣播的并且可以對廣播進行修改或是取消廣播向下傳遞。系統根據接收者定義的優先級順序決定哪個接收者先接收到它,接收者處理完后可以將結果傳遞給優先級低的接收者也可以停止廣播使得其他優先級低的接收者無法接收到該廣播。優先級通過android:priority屬性定義,數值越大優先級別越高,取值范圍:-1000到1000,雖然API文檔介紹對sendBroadcast發送的廣播無效,不過本人測試同樣有效,相同優先級的接收者接收到廣播的順序隨機。Android系統收到短信、接到電話后發送的廣播都是有序廣播,所以可以進行短信或電話的攔截,即取消廣播。

PS:有序廣播可以在onReceive函數中通過BroadcastReceiver的abortBroadcast接口(這個接口對sendBroadcast發送廣播無效)取消廣播,通過接口sendOrderedBroadcast(Intent, String, BroadcastReceiver, android.os.Handler, int, String, Bundle)發送的廣播即便優先級高的廣播取消了廣播,接口參數中指定的BroadcastReceiver依然可以在其他接收者處理完后接收到廣播。通過BroadcastReceiver的getResultExtras接口獲得結果的Bundle再通過Bundle的putString和getString方法修改或獲取數據,可以見本文最后的實例代碼舉例。

?

6、特殊的BroadcastReceiver

a. LocalBroadcastManager本地廣播

android引入了LocalBroadcastManager解決在第4部分安全性介紹的一些問題,LocalBroadcastManager除了能解決BroadcastReceiver進程間安全性問題外,相對Context操作的BroadcastReceiver而言還具有更高的運行效率。

使用LocalBroadcastManager需要引入Android Support Library,如何引入見Add Support Package。

本地廣播通過LocalBroadcastManager.getInstance(context).sendBroadcast(intent)發送廣播,LocalBroadcastManager.getInstance(context).registerReceiver注冊服務,通過LocalBroadcastManager.getInstance(context).unregisterReceiver取消注冊服務,其他同普通廣播.

?

b. Sticky?Broadcast粘性廣播

如果發送者發送了某個廣播,而接收者在這個廣播發送后才注冊自己的Receiver,這時接收者便無法接收到剛才的廣播,為此Android引入了StickyBroadcast,在廣播發送結束后會保存剛剛發送的廣播(Intent),這樣當接收者注冊完Receiver后就可以繼續使用剛才的廣播。如果在接收者注冊完成前發送了多條相同Action的粘性廣播,注冊完成后只會收到一條該Action的廣播,并且消息內容是最后一次廣播內容。系統網絡狀態的改變發送的廣播就是粘性廣播。

粘性廣播通過Context的sendStickyBroadcast(Intent)接口發送,需要添加權限<uses-permission android:name="android.permission.BROADCAST_STICKY"/>

也可以通過Context的removeStickyBroadcast(Intent?intent)接口移除緩存的粘性廣播。

?

c. OrderedBroadcastReceiver有序廣播

這個在5分類中已經介紹,接收者有序接收廣播并可以修改廣播結果或是取消廣播,通過Context的sendOrderedBroadcast接口發送

?

d. StickyOrderedBroadcast粘性有序廣播

這個就是粘性廣播和有序廣播的結合了,通過Context的sendStickyOrderedBroadcast接口發送。

?

各種廣播操作Demo示例代碼見BroadcastReceiverDemo,由于本地廣播的support library暫時下載不了,不包括本地廣播,本地廣播操作間上面介紹。

注意AndroidManifest文件中需要添加粘性廣播操作權限<uses-permission android:name="android.permission.BROADCAST_STICKY"/>

?

參考:

http://developer.android.com/reference/android/content/BroadcastReceiver.html

from :http://www.cnblogs.com/trinea/archive/2012/11/09/2763182.html

總結

以上是生活随笔為你收集整理的【转】Android BroadcastReceiver介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: www.激情五月.com | 日本一区二区三区免费电影 | 国产丝袜视频 | 欧美日韩亚洲天堂 | 亚洲精品中文字幕 | 一级日韩片 | 欧美色图国产精品 | 欧美亚洲精品一区二区 | 精品久久久久久无码国产 | 大陆农村乡下av | 精品人妻一区二区三区日产 | 91久久精品一区二区 | 国产经典三级在线 | 日操干| av高清一区 | 国产女主播av | 中文字幕精品一区二区三区视频 | 日韩av网站在线 | 亚洲精品日韩欧美 | 欧美日韩另类一区 | 亚洲免费网站在线观看 | 男生和女生差差视频 | 久久精品a| 91日本精品 | 抖音视频在线观看 | 激情久久免费视频 | 性五月天| 精品无码人妻一区二区三区品 | 欧美一区二区视频免费观看 | 91 高清 在线 制服 偷拍 | 国产无遮挡裸体免费视频 | 国产999精品久久久久久 | 噜噜色网| 婷婷丁香六月天 | 中文字幕黄色av | 亚洲成av人片一区二区梦乃 | 国产又色又爽又黄 | 久一区二区三区 | 日韩一区免费 | 欧美 日韩 国产 一区二区三区 | 日批毛片 | 亚欧精品在线观看 | 熟女少妇一区二区 | 久久久久久久 | 国产精品久久久国产盗摄 | 激情女主播| 欧美极品在线视频 | 天堂资源最新在线 | 国产精品一二三级 | 午夜高清视频 | 影音先锋国产在线 | 亚洲高h | 在线观看一二三区 | av影视在线| 久青草视频在线观看 | 国产视频一区在线播放 | 先锋影音av资源网 | 疯狂做爰的爽文多肉小说王爷 | 久久久精品中文字幕麻豆发布 | 丁香社区五月天 | 最新在线观看av | 成人黄色激情视频 | proumb性欧美在线观看 | 亚洲成人av一区二区 | 亚洲日日操 | 久热精品免费视频 | 欧美在线视频网站 | 激情xxx| 欧美成人午夜电影 | 一个人在线免费观看www | 亚洲色图狠狠干 | 成年人在线免费观看视频网站 | 国内自拍av | 日韩最新中文字幕 | 国产色综合天天综合网 | 孕妇疯狂做爰xxxⅹ 国产精品乱码久久久久久 99久久久成人国产精品 | 五月深爱婷婷 | 人人看超碰 | 欧美日韩电影一区二区三区 | 亚洲精品成人影视 | av大全在线| 香蕉精品在线 | 精品一区二区三区免费毛片 | 中文字幕在线字幕中文 | 97干在线 | 欧美午夜不卡 | 国产一区二区三区精品视频 | 国产做爰免费观看 | av女优天堂网 | 久久久久亚洲av片无码v | 2021狠狠干 | 国产一区在线免费观看 | 中文字幕一区二区不卡 | 春色伊人 | 男女网站在线观看 | 国产欧美日韩精品区一区二污污污 | 日韩91精品| 三点尽露的大尺度国产 | 国产91精品一区二区绿帽 |