關於Broadcast Receiver面試詳解

一、廣播

1.廣播定義

在安卓當中,廣播是用的比較廣泛的應用程序之間傳輸信息的機制,廣播類似於我們java當中觀察者模式,觀察者模式是什麼意思呢?就是說當一個被觀察者數據進行變化的時候,它回去相應的通知觀察者做相應的數據處理,安卓中我們要發送的廣播內容,它其實是一個Intent,在這個Intent裏面,我們可以攜帶一些我們要傳送的數據.

在Android中,Broadcast是一種廣泛運用的在應用程序 之間傳輸信息的機制,Android中我們要發送的廣播內容是一個Intent,這個Intent可以攜帶我們要傳送的數據.

注:廣播實現了不同程序之間的數據傳輸與共享,只要和發送廣播的Action相同的接收者,都能接收這個廣播,就是你發送一個廣播,可以被很多的廣播receive所接受,典型的就是:系統應用,電話,短信等通知,只要我們實現了他們Action的廣播,這BroadcastReceive就能接收他們的數據.第二個廣播接收者,它還可以有一個通知的作用,比如說:你在服務中,你可以給發送程序給Activity,讓它來更新UI.Service是沒有界面的,它是在後臺運行的一個組件,所以說,我們可以通過廣播接收者專門來接收從service發過來的數據和通知,而不要service直接和activity進行交互.

2.廣播的場景

A.同一個App具有多個進程的不同組件之間的信息通信

(比如說,你在app裏面,你回開啓多個進程,比如說會有定位地圖的進程,會有主進程,來進行相應的操作,這時候兩個進程之間通信,就可以用到廣播 )

B.不同App之間的組件之間消息通信

(比如說幾個App之間的通信,在很多大型公司,會開發很多APP,這些APP會有互相的推廣啊,運營之類的,會用到廣播消息機制)

3.廣播的種類

1)Normal Broadcast : Context.sendBroadcast   (普通廣播)

2)System Broadcast : Context.sendOrderedBroadcast  (有序廣播也叫系統廣播)

3)Local Broadcast : 只在自身App內傳播  (本地廣播)

二、實現廣播-receiver

1.靜態註冊:註冊完成就一直運行

直接把廣播接收者寫到manifest文件當中,有一個特點,就是所在的activity銷燬了,仍然能夠接收到廣播,甚至你可以把進程殺死,這個App殺死,仍然能收到廣播,但是和動態註冊相比還是不是太靈活.

2.動態註冊: 跟隨Activity的生命週期

特點是要在代碼中調用registerReceiver方法註冊,來進行整個的BroadcastReceiver的註冊,但是,動態註冊需要注意的是,一定要在onDestroy()方法裏面onRegisterReceiver這方法,否則你會引起內存泄漏,還有一個特點,它的生命週期是跟隨Activity 的生命週期的,所以說當Activity銷燬了,這個動態註冊的廣播接收者,它也就失效了.

三、廣播實現機制

1.自定義廣播接收者BroadcastReceiver,並複用onRecvice()方法;

2.通過Binder機制向AMS(Activity Manager Service)進行註冊;

Ams它是貫穿安卓系統組件的核心服務,它負責啓動四大組件的啓動,切換,調度,以及應用程序的管理和調動工作,所以說Activity Manager Service是負責Broadcast的創建.

Binder機制是安卓進程間通信的一個核心,它的整體設計架構是客戶端,服務端結構,cs結構,客戶端進程可以獲取到服務端進程,並通過代理接口然後通過方法來讀取數據,來完成進程間的數據通信.

3.廣播發送者通過Binder機制向AMS發送廣播;

4.AMS查找符合相應條件(IntentFilter/Permission等)的BroadcastReceiver,將廣播發送到BroadcastReceiver(一般情況下是Activity)相應的消息循環隊列中;

5.消息循環執行拿到此廣播回調BroadcastReceiver中的onReceive()方法.

四、LocalBroadcastManager詳解

1.使用它發送的廣播將只在自身的App內傳播,因此你不比比擔心泄漏隱私數據

2.其它App無法對你的App發送該廣播,因爲你的App根本就不可能接收到非自身引用發送的該廣播,因此你不必擔心有安全漏洞可以利用

3.比系統的全局廣播更加高效

注意:給大家強調一下隱私漏洞和安全數據,我們知道如果不是本地廣播的話,如果別人反編譯了你的APK後,知道了你的Action,那麼第三方應用就可以發送與該action匹配的廣播,而你的應用也能接收到,而不是像本地廣播一樣,接收不到,這時候,第三方應用就可以拿廣播來做很多事情,比如說它可以分享鏈接讓你跳轉過去啊,就是植入廣告的形式.第二:如果別人知道你的Action,當你使用廣播來傳送一些數據的時候,別的應用也能接收到廣播,通過Action匹配獲取到你的私密數據,包括你的用戶名,你的地理位置,然後就可以推送信息,給你發送一些惡意的廣播信息,這就是本地廣播的一個作用.

根據LocalBroadcastManager底層源碼,給大家簡單總結一下

1.LocalBroadcastManager高效的原因主要是因爲它內部是通過Handler實現的,它的sendBroadcast()方法含義並非和我們平時所用的一樣,它的sendBroadcast()方法其實是通過handler發送一個Message實現的

2.既然它內部是通過Handler來實現廣播的發送的,那麼相比與系統廣播通過Binder實現那肯定是更高效了,同時使用Handler來實現,別的應用無法向我們的應用發送該廣播,而我們應用n內部發送的廣播也不會離開我們的應用

3.LocalBroadcastManager內部協作主要是靠這兩個Map集合: mReceivers和mActions,當然還有一個List集合mPending

Broadcasts,這個主要就是存儲待接收的廣播d對象

(這就是源碼總結的三個重要的知識點)

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章