一.廣播
1.定義
? ? 在android中,broadcast是一種廣泛運(yùn)用在應(yīng)用程序之間傳輸信息的機(jī)制,android中我們要發(fā)送的廣播內(nèi)容是一個(gè)Intent,在這個(gè)Intent中可以攜帶我們要傳送的數(shù)據(jù),可以變相的將廣播理解為觀察者模式
2.場(chǎng)景
? ? 1>同一個(gè)app中具有多個(gè)進(jìn)程的不同組件之間的消息通信,例如在app中有多個(gè)進(jìn)程,
? ? 2>不同app之間的組件之間的消息通信
3.種類??
????1>普通的廣播,Normal Broadcast:Context.sendBroadcast,(例如看新聞,張三可以看,李四也可以看,同時(shí)看的都是同一個(gè)新聞,只要電視播新聞,大家都能一起看)
????2>有序廣播 System Broadcas:Context.sendOrderedBroadcast(例如中央撥款,先下發(fā)到市,市長(zhǎng)有權(quán)利繼續(xù)下發(fā),也可以終止,如果終止,那么縣長(zhǎng)收不到,如果繼續(xù)下發(fā)縣長(zhǎng)可以收到,但是撥款可以由市長(zhǎng)進(jìn)行改變)
????3>本地廣播 Local Broadcast,只能在自身App內(nèi)傳播,(例如爸爸給你打錢,只有你知道,別人不會(huì)知道)
二.實(shí)現(xiàn)廣播.receiver
? ? 1.靜態(tài)注冊(cè):注冊(cè)完成后一直執(zhí)行,做法就是直接將一個(gè)receiver寫在AndroidManifest中,無論程序銷毀還是activity關(guān)閉都不會(huì)影響廣播的接收
? ? 2.動(dòng)態(tài)注冊(cè):跟隨著activity的生命周期,你需要去調(diào)用registerreceiver,在activity銷毀的時(shí)候要調(diào)用unregisterreceiver,要不然會(huì)引起內(nèi)存泄漏
三.廣播實(shí)現(xiàn)機(jī)制
? ? 1.自定義廣播接收者BroadcastReceiver,并復(fù)寫onReceiver()方法
? ? 2.通過binder機(jī)制想AMS(activity Manager Service)進(jìn)行注冊(cè)
? ? 3.廣播發(fā)送者通過Binder機(jī)制向AMS發(fā)送廣播
? ? 4.AMS查找符合相應(yīng)條件(IntentFilter/Permissiion等)的BroadcasrReceiver,將廣播發(fā)送到BroadcasrReceiver(一般情況下是Activity)相應(yīng)的消息循環(huán)隊(duì)列中;
? ? 5.選修循環(huán)執(zhí)行拿到此廣播,回調(diào)BroadcasrReceiver中onReceive()方法
四.LocalBroadcastManager詳解
? ? 1.使用它發(fā)送的廣播只能在自身App內(nèi)傳播,因此你不比擔(dān)心泄露隱私數(shù)據(jù)
? ? 2.其他APP無法對(duì)你的APP發(fā)送該廣播,因?yàn)槟愕腶pp根本就不可能接收到非自身應(yīng)用發(fā)送的該廣播,因此你不必?fù)?dān)心有安全漏洞可以利用
? ? 3.比系統(tǒng)的全局廣播更加高效
五.LocalBroadcastManager和系統(tǒng)廣播有什么區(qū)別
? ? 1.LocalBroadcastManager高效的原因主要是因?yàn)樗鼉?nèi)部是通過Handler實(shí)現(xiàn)的,它的sendBroadcast(方法含義并非和我們平時(shí)所用的一樣 ,它的sendBroadcast()方法其實(shí)是通過handler發(fā)送一個(gè)messager實(shí)現(xiàn)的
? ? 2.既然是它內(nèi)部是通過handler來實(shí)現(xiàn)廣播發(fā)送的,那么相比與系統(tǒng)廣播通過binder實(shí)現(xiàn)那肯定是更高效,同時(shí)使用Handler來實(shí)現(xiàn),別的應(yīng)用無法向我們的應(yīng)用發(fā)送該廣播,而我們應(yīng)用內(nèi)發(fā)送的廣播也不會(huì)離開我們的應(yīng)用
? ? 3.LocalBroadcastManager內(nèi)部協(xié)作主要是靠這兩個(gè)Map集合:mReceivers和mActions,當(dāng)然還有一個(gè)list集合mPendingBroadcasts,這個(gè)主要就是存儲(chǔ)待接收的廣播對(duì)象