android 无法接收广播_别告诉我你不认识Android中广播接收者(二)
前面我們了解了什么是廣播接收者與廣播接收者的創建,這一次我們要接著繼續去了解廣播接收者的相關知識,這些知識包括廣播接收者的注冊、自定義廣播與廣播的類型。
當我們學習完廣播接收者之后,該如何才能讓它起到作用呢?還有廣播接收者是用來接收廣播的?那這些接收到的廣播可以自己定義嗎?廣播有分類嗎?
這一連串的問題,讓我們是不是有點頭大?接下來,就帶大家一起來解開這些疑惑。
第1點 自定義廣播
Android系統中自定義了很多類型的廣播,當系統提供的廣播不能滿足實際需求時,可以自定義廣播,同時需要編寫對應的廣播接收者。
接下來通過一個圖例來演示自定義廣播的發送與接收過程,如下圖這樣。
由上圖我們可以看到,當自定義廣播發送消息時,會將消息存儲到公共消息區中,而公共消息區中如果存在對應的廣播接收者,則會及時接收這條信息。廣播的這種機制可以處理程序中信息的傳遞功能。
第2點 廣播的類型
Android系統中提供了兩種廣播類型,分別是有序廣播和無序廣播,開發者可根據需求為程序設置不同的廣播類型,接下來針對這兩種廣播類型進行介紹。
1.無序廣播
無序廣播是完全異步執行的,發送廣播時,所有監聽這個廣播的廣播接收器都會接收到此廣播消息,但接收和執行的順序不確定。
無序廣播的效率比較高,但無法被攔截,工作流程如下圖這樣。
由上圖可知,當發送一條廣播時,所有的廣播接收者都會接收。
2.有序廣播
有序廣播是按照廣播接收者聲明的優先級別被依次接收,發送廣播時,只會有一個廣播接收者能夠接收此消息,當在此廣播接收者中邏輯執行完畢之后,廣播才會繼續傳遞。
相比無序廣播,有序廣播的廣播效率較低,但此類型是有先后順序的,并可被攔截,工作流程如下圖這樣。
由上圖可知,當有序廣播發送消息時,優先級最高的廣播接收者最先接收,優先級最低的最后接收。如果優先級最高的廣播接收者將廣播終止,那么廣播將不再向后傳遞。
第3點 廣播接收者的注冊
如果想要接收到一個廣播消息,則需要在程序中注冊接受該廣播的廣播接收者,廣播接收者的注冊有兩種方式,分別為動態注冊和靜態注冊。接下來,針對這兩種注冊方式進行詳細的講解。
1.動態注冊
由于動態注冊是在Activity中通過代碼注冊廣播接收者,所以在MainActivity中動態注冊廣播接收者MyBroadcastReceiver的代碼如下方這樣。
上述代碼中,第9行代碼創建了廣播接收者實例,第12~13行代碼實例化過濾器,并通過addAction()方法設置要過濾的action。
第14行代碼通過registerReceiver()方法注冊廣播接收者,該方法中的第1個參數receiver表示廣播接收者,第2個參數intentFilter表示實例化的過濾器。
第16~20行代碼重寫了onDestroy()方法,在該方法中通過unregisterReceiver()方法注銷廣播接收者MyBroadcastReceiver。
需要注意的是,動態注冊的廣播接收者是否被注銷依賴于注冊廣播的組件,例如在Activity中注冊了廣播接收者,當Activity銷毀時,廣播接收者也隨之被注銷。
2.靜態注冊
靜態注冊是在清單文件中通過配置廣播接收者完成注冊的。
通過第二種方式創建完廣播接收者之后,Android Studio會自動在AndroidManifest.xml文件中進行靜態注冊創建的廣播接收者,靜態注冊廣播接收者的代碼如下面這樣。
根據上述代碼可知,在標簽中添加了一個標簽,該標簽中的name屬性值是要注冊的廣播接收者,屬性enabled的值為true,表示廣播接收者可以由系統實例化,屬性exported的值為true表示可以接收當前程序之外的廣播。
此種設置就是靜態注冊廣播接收者,這種靜態注冊的特點是無論應用程序是否處于運行狀態,廣播接收者都會對程序進行監聽。
需要注意的是,在Android 8.0之后,使用靜態注冊的廣播接收者將無法接收到廣播,當發送廣播時,Android系統的提示信息像下方這樣。
好了,今天已經將廣播接收者的相關知識講解完畢,如果大家有其他想法可以隨時給出建議,今天先講解到這里,希望這篇文章能給大家帶來幫助。
總結
以上是生活随笔為你收集整理的android 无法接收广播_别告诉我你不认识Android中广播接收者(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: powershell连接数据库_Powe
- 下一篇: 自动获取mysql建表语句_脚本工具--