咱們繼續,今天覆習一下broadcast廣播的相關知識,老步驟,一步步來。
1.概念:
broadcast是一種廣泛運用於應用程式之間傳輸資訊的機制。從本質上來說,廣播內容就是乙個intent,在intent中攜帶資料。
2.使用場景:
3.種類:
(1)普通廣播:context.sendbroadcast();
(2)有序廣播:context.sendorderbroadcast();
4.實現原理:
在講實現原理時,先介紹兩個灰常重要的概念;
ams:activity manager service ,它是貫穿android系統元件的核心服務,負責四大元件的啟動,執行和排程,應用程式的管理和排程工作;
binder機制:binder是android程序間通訊的核心,整體架構採用c/s架構,客戶端程序可以獲取服務端的**,並通過相應的方法去進行程序間通訊。關於這個binder機制,會有一篇專門詳細介紹它。
觀察者模式:觀察者模式(有時又被稱為模型-檢視(view)模式、源-收聽者(listener)模式或從屬者模式)是軟體設計模式的一種。在此種模式中,乙個目標物件管理所有相依於它的觀察者物件,並且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。此種模式通常被用來實現事件處理系統。
了解了這三個概念之後,就可以來談一談廣播的實現原理了。
沒錯,廣播的內部實現就是採用觀察者模式,將廣播的傳送者與接收者完全解耦,使得系統易於擴充套件,方便整合;
(1)模型講解:
訊息訂閱者:廣播接收者;
訊息傳送者:廣播傳送者;
訊息中心:ams;
這裡在網上看到一張圖,講的很好,就拷了下來;
看了上面的還有點懵的兄弟,我來通俗的解釋一下:
其實這個就像我們生活中訂閱報紙是一樣的,首先,先問,如果你想每天早上有乙份今天的報紙放在你家門口,你會怎麼做,你是不得先在某家報紙印刷商訂購,交錢之後,人家才會給你每天派送。這就對應了第一步,broadcastreceiver就相當於你,你訂閱報紙,就相當於broadcastreceiver在ams上註冊,ams就相當於報紙印刷商,binder機制就相當於報紙派送員每天騎著自行車往你家門口放報紙。再想一想,報紙印刷商每天的報紙是誰給他的呢,是不是報社給模板資料,所以第二步廣播傳送者通過binder機制向ams傳送廣播,就相當於,報社通過傳真呀,**呀,pdf文件啥的方式把模板資料傳送給印刷商,各種角色都已經搞清楚了,那麼下面就好理解了,第三步ams根據廣播傳送者要求,在已註冊列表中,尋找合適的廣播接收者,這就相當於印刷商按照你在他那留下的****,家庭住址,找到你這個人。第四步,ams將廣播傳送到合適的廣播接收者相應的訊息迴圈佇列中,派送員也不可能就送你一家,你得「排隊」等著他送過去呢;第五步就輕鬆了,你拿到報紙了,開始喝著牛奶,看著報紙,開始新的一天了。
看完上面的一大段話,接下來輕鬆一下,看看下面的實現**,相信搞懂了上面的兄弟,接下來的**就很容易理解了;
先建立乙個「你」:
開始訂閱:public class broadreceivertest extends broadcastreceiver
}
派送報紙:android:name=".broadcastface.broadreceivertest">
android:name="com.pgg.haha"/>
intent-filter>
receiver>
其實還有一種動態註冊的方法,一般都是在activity的onresume()方法裡呼叫registerreceiver(broadreceiver,intentfilter)註冊,然後在ondestroy()方法裡呼叫unregisterreceiver(broadcastreceiver)登出。動態註冊就是比靜態註冊多了乙個生命週期的問題,它跟隨元件的生命週期而變化,而靜態註冊就是已註冊就常駐,不受任何元件影響,就算應用程式關閉,有廣播來,依然會接收;case r.id.btn_register:
intent intent1=new intent();
intent1.setaction("com.pgg.haha");
intent1.putextra("name","彭港歸");
this.sendbroadcast(intent1);
break;
5.本地廣播的特點:有大用
(3)比系統廣播更加高效;
其高效的主要原因是因為他內部是通過handler實現的,它的sendbroadcast方法其實是通過handler傳送乙個message實現的,其內部協作是靠mreceivers,mactions這兩個map集合和乙個list集合mpendingbroadcasts,這個list集合儲存的就是帶接收的廣播物件;
private final hashmap
arraylist
> mreceivers
= new hashmap
arraylist
>();
private final hashmap
arraylist
> mactions
= new hashmap
arraylist
>();
private final arraylist
mpendingbroadcasts
= new arraylist
();
**:
咱們繼續,今天覆習一下broadcast廣播的相關知識,老步驟,一步步來。
android面試 4 檔案儲存
1.sharepreference?sharedpreferences類,它是乙個輕量級的儲存類,特別適合用於儲存軟體配置引數。sharedpreferences儲存資料,其背後是用xml檔案存放資料,檔案存放在 data data shared prefs目錄下 乙個簡單的儲存 如下 shared...
Android面試小計
使用context.startservice 啟動service 其生命週期為context.startservice oncreate onstart service running context.stopservice ondestroy service stop 所以呼叫startservi...
Android面試總結
面試中遇到的問題 http 1 listview的非同步載入 更好的系統 變數,監聽listview的滾動狀態,scroll state fling,scroll state idle scroll state touch scroll 比例壓縮,執行緒池控制oom,兩篇文章 2 listview ...