四,Broadcast面試詳解
1,廣播定義
在android中,broadcast是一種廣泛運用在應用程序內部或之間傳輸信息的機制,Android中要發送的廣播內容是一個Intent,這個Intent中可以攜帶我們要傳送的數據。
2,廣播使用場景
參考自:https://www.cnblogs.com/lwbqqyumidi/p/4168017.html
1.同一app內部的同一組件內的消息通信(單個或多個線程之間);(可用handler解決
)
2.同一app內部的不同組件之間的消息通信(單個進程);(可用EventBus
)
3.同一app具有多個進程的不同組件之間的消息通信;
4.不同app之間的組件之間消息通信;
5.Android系統廣播在特定情況下與App之間的消息通信。
後三種常用廣播解決
3,廣播的種類
參考自:https://blog.csdn.net/carson_ho/article/details/53160580
- 普通廣播(Normal Broadcast)
- 系統廣播(System Broadcast)
- 有序廣播(Ordered Broadcast)
- 粘性廣播(Sticky Broadcast)
- App應用內廣播(Local Broadcast)
4,廣播的註冊
參考自:https://blog.csdn.net/u012702547/article/details/46955787
- 靜態註冊:註冊完成就一直運行
- 動態註冊:跟隨activity的生命週期
5,內部實現機制
(1),自定義廣播接收器BroadcastReceiver,並複寫onReceive方法
(2),通過Binder機制向AMS(Activity Manager Service
)進行註冊
(3),廣播發送者通過Binder機制向AMS發送廣播
(4),AMS查找符合相應條件(IntentFilter/Permission等)的BroadcastReceiver,將廣播發送到BroadcastReceiver(一般是activity)相應的消息循環隊列中
(5),消息循環執行,拿到此廣播,回調BroadcastReceiver的onReceive方法
6,LocalBroadcastManager詳解
具體說明 https://blog.csdn.net/carson_ho/article/details/53160580
- 高效性,比系統的全局廣播更高效
- 安全性,只在自身app內傳播,不必擔心信息泄露
源碼分析
- LocalBroadcastManager高效的原因主要是因爲內部是通過Handler發送message實現的,它的sendBroadcast方法含義和我們平時所用的不一樣。
- 既然是Handler實現的,所以相比系統廣播通過Binder實現更高效,同時使用Handler實現,也使廣播控制在應用內部,不會發出去也不會被攻擊。
- LocalBroadcastManager內部協作主要是靠這兩個Map集合:mReceivers和mActions,當然還有一個List集合mPendingBroadcasts,這個主要是存儲待接收的廣播對象