廣播的機制的原理和使用方
1.Android廣播機制概述
Android廣播分為兩個方面:廣播發送者和廣播接收者,BroadcastReceiver指的就是廣播接收者(廣播接收器)。廣播作為Android元件間的通訊方式,可以使用的場景如下:
1.同一app內部的同一組件內的訊息通訊(單個或多個執行緒之間);
2.同一app內部的不同元件之間的訊息通訊(單個程序);
3.同一app具有多個程序的不同元件之間的訊息通訊;
4.不同app之間的元件之間訊息通訊;
5.Android系統在特定情況下與App之間的訊息通訊。
從實現原理看上,Android中的廣播使用了觀察者模式,基於訊息的釋出/訂閱事件模型。具體實現流程要點粗略概括如下:
(1)廣播接收者
(2)廣播發送者通過binder機制向AMS傳送廣播;
(3)AMS查詢符合相應條件(IntentFilter/Permission等)的BroadcastReceiver,將廣播發送到BroadcastReceiver(一般情況下是Activity)相應的訊息迴圈佇列中;
(4)訊息迴圈執行拿到此廣播,回撥BroadcastReceiver中的onReceive()方法。
廣播發送者和廣播接收者分別屬於觀察者模式中的訊息釋出和訂閱兩端,AMS屬於中間的處理中心。廣播發送者和廣播接收者的執行是非同步的,發出去的廣播不會關心有無接收者接收,也不確定接收者到底是何時才能接收到。顯然,整體流程與EventBus非常類似。
現分析實際應用中的適用性:
第一種情形:同一app內部的同一組件內的訊息通訊(單個或多個執行緒之間),實際應用中肯定是不會用到廣播機制的(雖然可以用),無論是使用擴充套件變數作用域、基於介面的回撥還是Handler-post/Handler-Message等方式,都可以直接處理此類問題,若適用廣播機制,顯然有些“殺雞牛刀”的感覺,會顯太“重”;
第二種情形:同一app內部的不同元件之間的訊息通訊(單個程序),對於此類需求,在有些教複雜的情況下單純的依靠基於介面的回撥等方式不好處理,此時可以直接使用EventBus等,相對而言,EventBus由於是針對統一程序,用於處理此類需求非常適合,且輕鬆解耦。
第三、四、五情形:由於涉及不同程序間的訊息通訊,此時根據實際業務使用廣播機制會顯得非常適宜。下面主要針對Android廣播中的具體知識點進行總結。
6.廣播的兩種註冊方式
註冊BroadcastReceiver兩種方式:
方式一,靜態的在AndroidManifest.xml中用<receiver>標籤宣告註冊,並在標籤內用<intent- filter>標籤設定過濾器。
方式二,動態地在程式碼中先定義並設定好一個 IntentFilter物件,然後在需要註冊的地方調 Context.registerReceiver()方法,如果取消時就呼叫Context.unregisterReceiver()方法。如果用動 態方式註冊的BroadcastReceiver的Context物件被銷燬時,BroadcastReceiver也就自動取消註冊了。
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(String); 為BroadcastReceiver指定action,使之用於接收同action的廣播 registerReceiver(BroadcastReceiver,intentFilter);
一般在onStart中註冊,onStop中取消unregisterReceiver 傳送廣播訊息 。指定廣播目標Action:Intent Intent = new Intent(action-String)指定了此action的receiver會接收此廣播。
7.廣播發送及廣播型別
下面分別總結下各種型別的傳送方式及其特點。
1).Normal Broadcast:普通廣播
此處將普通廣播界定為:開發者自己定義的intent,以context.sendBroadcast_"AsUser"(intent, ...)形式。具體可以使用的方法有:
sendBroadcast(intent)/sendBroadcast(intent, receiverPermission)/sendBroadcastAsUser(intent, userHandler)/sendBroadcastAsUser(intent, userHandler,receiverPermission)。
普通廣播會被註冊了的相應的感興趣(intent-filter匹配)接收,且順序是無序的。如果傳送廣播時有相應的許可權要求,BroadCastReceiver如果想要接收此廣播,也需要有相應的許可權。
2).System Broadcast: 系統廣播
Android系統中內建了多個系統廣播,只要涉及到手機的基本操作,基本上都會發出相應的系統廣播。如:開啟啟動,網路狀態改變,拍照,螢幕關閉與開啟,點亮不足等等。每個系統廣播都具有特定的intent-filter,其中主要包括具體的action,系統廣播發出後,將被相應的BroadcastReceiver接收。系統廣播在系統內部當特定事件發生時,有系統自動發出。
3)Ordered broadcast:有序廣播
有序廣播的有序廣播中的“有序”是針對廣播接收者而言的,指的是傳送出去的廣播被BroadcastReceiver按照先後循序接收。有序廣播的定義過程與普通廣播無異,只是其的主要傳送方式變為:sendOrderedBroadcast(intent, receiverPermission, ...)。
廣播的生命週期:
廣播接收器僅在它執行這個方法時處於活躍狀態。當 onReceive() 返回後,它即為失活狀態。
擁有一個活躍狀態的廣播接收器的程序被保護起來而不會被殺死,但僅擁有失活狀態元件的程序則會在其它程序需要它所佔有的記憶體的時候隨時被殺掉。 所以,如果響應一個廣播資訊需要很長的一段時間,我們一般會將其納入一個衍生的執行緒中去完成,而不是在主執行緒內完成它,從而保證使用者互動過程的流暢。
相關推薦
[Android] 徹底瞭解Binder機制原理和底層實現
1.Binder通訊機制介紹 這篇文章會先對比Binder機制與Linux的通訊機制的差別,瞭解為什麼Android會另起爐灶,採用Binder。接著,會根據 Binder的機制,去理解什麼是Service Manager,在C/S模型中扮演什麼角色。最後,會從一次完整的通訊活動中,去理解Binder通訊
徹底瞭解Binder機制原理和底層實現
轉載地址: http://www.2cto.com/kf/201606/515548.html http://www.2cto.com/kf/201606/515548.html 1.Binder通訊機制介紹 這篇文章會先對比Binder機制與Linux的通訊機制的
springboot系列——重試機制原理和應用,還有比這個講的更好的嗎(附完整原始碼)
1. 理解重試機制 2. 總結重試機制使用場景 3. spring-retry重試元件 4. 手寫一個基於註解的重試元件 5. 重試機制下會出現的問題 6. 模板方法設計模式實現非同步重試機制 如果有,請轉給我! 1. 理解重試機制 “重試是為了提高成功的可能性“ 反過來理解,任何
廣播的機制的原理和使用方
1.Android廣播機制概述Android廣播分為兩個方面:廣播發送者和廣播接收者,BroadcastReceiver指的就是廣播接收者(廣播接收器)。廣播作為Android元件間的通訊方式,可以使用的場景如下:1.同一app內部的同一組件內的訊息通訊(單個或多個執行緒之間
springMVC 的工作原理和機制、配置
spring mvc+my batis kafka dubbo+zookeerper restful redis分布式緩存 工作原理下面的是springMVC的工作原理圖:1、客戶端發出一個http請求給web服務器,web服務器對http請求進行解析,如果匹配DispatcherServle
Numpy常用概念-對象的副本和視圖、向量化、廣播機制
一維數組 運算 shape nbsp 兼容性 需要 for numpy 方式 一、引言 在我們操作數組的時候,返回的是新數組還是原數組的鏈接,我們就需要了解對象副本和視圖的區別。 向量化和廣播是numpy內部實現的基礎。 二、對象副本和視圖 我們應該註意到,在操作數組的時候
8.8.ZooKeeper 原理和選舉機制
TE 宋體 per 機制 CA tro 通過 family 沒有 1.ZooKeeper原理 Zookeeper雖然在配置文件中並沒有指定master和slave但是,zookeeper工作時,是有一個節點為leader,其他則為follower,Leader是通 過內
Java Token的原理和生成使用機制
=== 舉例 dap 被人 depend 內容 cto contex jws 在此之前我們先了解一下什麽是Cookie、Session、Token 1、什麽是Cookie? cookie指的就是瀏覽器裏面能永久存儲數據的一種數據存儲功能。cookie由服務器生成,發送給瀏
TCP的ACK原理和延遲確認機制
一、ACK定義 TCP協議中,接收方成功接收到資料後,會回覆一個ACK資料包,表示已經確認接收到ACK確認號前面的所有資料。 ACK欄位長度為32位,能表示0~2^32-1之間的值。 二、ACK作用 傳送方在一定時間內沒有收到服務端的ACK確認包後,就會重新發送TCP資料包。傳送方收到了ACK,
HashMap工作原理和擴容機制
1. HashMap工作原理 HashMap作為優秀的Java集合框架中的一個重要的成員,在很多程式設計場景下為我們所用。HashMap作為資料結構散列表的一種實現,就其工作原理來講單獨列出一篇部落格來講都是不過分的。由於本文主要是簡單總結其擴容機制,因此對於HashM
Java 中的異常處理機制的簡單原理和應用
異常是指 java 程式執行時(非編譯)所發生的非正常情況或錯誤,與現實生活中的事件很 相似,現實生活中的事件可以包含事件發生的時間、地點、人物、情節等資訊,可以用一個 物件來表示,Java 使用面向物件的方式來處理異常,它把程式中發生的每個異常也都分別封 裝到一個物件來表示
Java基礎:深入理解java異常處理機制的原理和開發應用【轉載】
Java異常處理機制在日常開發中應用頻繁,本篇文章主要在基礎的使用方法上,更進一步的,如何更加合理的使用異常機制,希望可以對各位朋友能有所幫助。 Java異常處理機制其最主要的幾個關鍵字:try、catch、finally、throw、throws,以及各種各樣
HTTPS 工作原理和 TCP 握手機制
1、HTTPS的工作原理 HTTPS在傳輸資料之前需要客戶端(瀏覽器)與服務端(網站)之間進行一次握手,在握手過程中將確立雙方加密傳輸資料的密碼資訊。TLS/SSL協議不僅僅是一套加密傳輸的協議,更是一件經過藝術家精心設計的藝術品,TLS/SSL中使用了非對稱加密,對稱加密以及HASH演算法。握手過程的具體
三分鐘看懂Nginx伺服器的快取原理和機制
作者:LifeIsButA_Span 來源: http://blog.csdn.net/lifeisbuta_span/article/details/70598586 Nginx伺服器的快取原理,是在學習過程中比較重要的一個知識點,學習通透之後,對於自己的
numpy和tensorflow中的廣播機制
廣播的引出 numpy兩個陣列的相加、相減以及相乘都是對應元素之間的操作。 import numpy as np x = np.array([[2,2,3],[1,2,3]]) y = np.array([[1,1,3],[2,2,4]]) print(x*y) #numpy當中
struts2的原理和工作機制
1、客戶端初始化一個指向Servlet容器(例如Tomcat)的請求; 2、這個請求經過一系列的過濾器(Filter)(這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器,這個過濾器對於Struts2和其他框架的整合很有幫助,例如:SiteMesh Plugin); 3、接著F
以 Okhttp3原始碼 為例 ------ 圖解 快取機制 的原理和實現(上)
快取機制一直以來是一個不可忽視的重要模組,廣泛地被運用到 網頁端和移動端。對於伺服器而言,客戶端的快取很大程度上緩解了它的壓力,更是為使用者帶來了產品快速響應的體驗,擁有很多好處。既然是網路請求,必然與HTTP協議聯絡緊密,不論你是否有這之類的經驗,此篇將會從基
Android 的廣播機制和兩種註冊方式
1.Android 的廣播機制 在 Android 裡面有各種各樣的廣播,比如電池的使用狀態,電話的接收和簡訊的接收都會產生一個廣播,應用程式開發者也可以監聽這些廣播並做出程式邏輯的處理。下面我畫一張粗略的圖來幫助大家理解廣播的執行機制。 Android 中有各式各
新浪微博傳送訊息和授權機制原理(WeiboSDK)
1.首先是在微博傳送訊息,對於剛開始做weibo傳送訊息的初學者會有一個誤區,那就是會認為需要授權後才可以傳送訊息,其實發送訊息只需要幾行程式碼就可以實現了,非常簡單,不需要先授權再發送訊息,因為weibosdk已經幫我們封裝好了。(此情況需要使用者安裝客戶端) 傳送訊息流