網站首頁 編程語言 正文
一、什么是BroadcastReceiver
BroadcastReceiver 是安卓系統中四大組件之一,在Android開發中,BroadcastReceiver的應用場景非常多,Android 廣播分為兩個角色:廣播發送者、廣播接收者。
1.1、作用
廣播接收器用于響應來自其他應用程序或者系統的廣播消息。
- 不同組件之間通信(包括應用內 / 不同應用之間)
- 與 Android 系統在特定情況下的通信(如當電話呼入時、網絡可用時)
- 多線程通信
1.2、實現原理
Android中的廣播使用了設計模式中的觀察者模式:基于消息的發布/訂閱事件模型。
模型中有3個角色:
- 消息訂閱者(廣播接收者)
- 消息發布者(廣播發布者)
- 消息中心(AMS,即Activity Manager Service)
廣播接收者通過 Binder機制在AMS注冊
廣播發送者通過 Binder 機制向AMS發送廣播
AMS根據廣播發送者要求,在已注冊列表中,尋找合適的廣播接收者(尋找依據:IntentFilter / Permission)
AMS將廣播發送到合適的廣播接收者相應的消息循環隊列中;
廣播接收者通過消息循環拿到此廣播,并回調 onReceive()
二、創建廣播接收器
廣播接收器需要實現為BroadcastReceiver類的子類,并重寫onReceive()
方法來接收以Intent對象為參數的消息。
public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { System.out.println("我是創建好的通知"); } }
三、注冊廣播接收器
廣播接收器的注冊分為兩種:
- 靜態注冊
- 動態注冊
3.1、靜態注冊
應用程序通過在AndroidManifest.xml中注冊廣播接收器來監聽制定的廣播意圖。
注冊
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <receiver android:name=".MyReceiver" android:exported="true"> <intent-filter> <action android:name="com.tiger_test" tools:ignore="BatteryLife" /> </intent-filter> </receiver>
發送通知
在Activity 中新增一個發送通知的點擊事件
public void onClickStatic(View view) { System.out.println("MainActivity2.onClickStatic"); // com.tiger_test 必須和清單文件中注冊的保持一致 Intent intent = new Intent(); intent.setAction("com.tiger_test"); intent.setPackage("com.traveleasy.activitydemo"); sendBroadcast(intent); }
當點擊通知發送按鈕時,系統會自動實例化MyReceiver類,并注冊到系統中。
靜態注冊是常駐廣播,不受任何組件生命周期的影響
注意:由于自8.0以后隱式廣播不能進行靜態注冊了,所以這里通過setPackage()
指定應用程序響應廣播。
3.2、動態注冊
通過registerReceiver()
注冊廣播監聽
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); // 在onCreate 中注冊廣播 MyReceiver myReceiver = new MyReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction("com.tiger_test"); registerReceiver(myReceiver, filter); }
觸發通知
public void onClickStatic(View view) { // com.tiger_test 必須和注冊的保持一致 Intent intent = new Intent(); intent.setAction("com.tiger_test"); sendBroadcast(intent); }
在頁面關閉時記得通過unregisterReceiver()
注銷廣播監聽,否則會因廣播持有Activity引用導致內存泄露。
@Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(myReceiver); }
運行結果
需要注意,在onReceive()
不能執行耗時操作,onReceive()
默認是在主線程中,進行耗時會阻塞主線程,如果非要執行耗時操作最好開啟一個服務在服務中進行耗時操作,不建議開啟線程來處理耗時操作,因為BroadCastReceiver的生命周期很短,可能在子線程結束前BroadCastReceiver已經退出,如果當BroadCastReceiver所在的進程結束,雖然該進程中可能有用戶啟動的新線程,但是由于該進程內沒有活動的組件,系統會在內存緊張的時候,優先結束掉該進程,這就會導致BroadCastReceiver啟動的子線程不能執行完。
四、系統廣播
上面我們一起學習了自定義廣播,下面我們一起來看一下Android 系統主要的系統廣播類型。
事件常量 | 描述 |
---|---|
android.intent.action.BATTERY_CHANGED | 持久的廣播,包含電池的充電狀態,級別和其他信息。 |
android.intent.action.BATTERY_LOW | 標識設備的低電量條件。 |
android.intent.action.BATTERY_OKAY | 標識電池在電量低之后,現在已經好了。 |
android.intent.action.BOOT_COMPLETED | 在系統完成啟動后廣播一次。 |
android.intent.action.BUG_REPORT | 顯示報告bug的活動。 |
android.intent.action.CALL | 執行呼叫數據指定的某人。 |
android.intent.action.CALL_BUTTON | 用戶點擊"呼叫"按鈕打開撥號器或者其他撥號的合適界面。 |
android.intent.action.DATE_CHANGED | 日期發生改變。 |
android.intent.action.REBOOT | 設備重啟。 |
總結
在BroadcastReceiver 中,廣播的類型主要分為兩大類
- 標注廣播
- 有序廣播
標準廣播
標準廣播是一種完全異步執行的廣播,在廣播發出之后,所有的BroadcastReceiver幾乎在同一時刻收到這個廣播消息,它們之間沒有先后順序,這種廣播的效率較高,并且不能被攔截。
有序廣播
有序廣播是一種完全同步的廣播,在廣播發出后只能有一個BroadcastReceiver能接收到這個廣播消息,當這個BroadcastReceiver中的邏輯執行完畢后,廣播才能繼續向下傳遞。所以這個廣播是有順序的,所以這種廣播也是可以被攔截的,如果被攔截了后面的BroadCastReceiver則不能收到廣播消息了。
原文鏈接:https://blog.csdn.net/u010755471/article/details/125505476
相關推薦
- 2022-06-09 ASP.NET?Core中的Configuration配置一_基礎應用
- 2022-08-05 EasyExcel 3.X 簡單寫入Excel文件數據
- 2022-07-02 Python使用?TCP協議實現智能聊天機器人功能_python
- 2022-12-09 python中為main方法傳參問題_python
- 2022-05-02 C語言如何實現一些算法或者函數你知道嗎_C 語言
- 2022-08-07 QT實戰之打開最近文檔功能的實現_C 語言
- 2022-04-17 IDEA下載源文件,報找不到
- 2023-07-26 TypeScript中的類型聲明declare
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支