真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

android廣播接收,Android廣播接收器

Android BroadcastReceiver詳解

BroadcastReceiver(廣播接收器)是Android四大組件之一,顧名思義,通過廣播的方式進(jìn)行消息傳遞,其本質(zhì)是一個全局的監(jiān)聽器,可以監(jiān)聽到各種廣播,可以用來實(shí)現(xiàn)不同組件之間的通信。廣播最大的特點(diǎn)就是發(fā)送方并不關(guān)心接收方是否接到數(shù)據(jù),也不關(guān)心接收方是如何處理數(shù)據(jù)的,通過這樣的形式來達(dá)到接、收雙方的完全解耦合。

創(chuàng)新互聯(lián)建站制作網(wǎng)站網(wǎng)頁找三站合一網(wǎng)站制作公司,專注于網(wǎng)頁設(shè)計(jì),成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站,網(wǎng)站設(shè)計(jì),企業(yè)網(wǎng)站搭建,網(wǎng)站開發(fā),建網(wǎng)站業(yè)務(wù),680元做網(wǎng)站,已為上1000+服務(wù),創(chuàng)新互聯(lián)建站網(wǎng)站建設(shè)將一如既往的為我們的客戶提供最優(yōu)質(zhì)的網(wǎng)站建設(shè)、網(wǎng)絡(luò)營銷推廣服務(wù)!

又稱無序廣播,這種廣播完全是異步的,所有與廣播Intent匹配的BroadcastReceiver,都可以收到這條廣播,并且不分先后順序,視為同時收到,通過Context.sendBroadcast()方法發(fā)送。這種廣播的效率比較高,但缺點(diǎn)是接收器不能將處理結(jié)果傳遞給下一個接收器,并且無法在中途終止廣播。

這是一種同步執(zhí)行的廣播,通過Context.sendOrderedBroadcast()方法發(fā)送,這種廣播發(fā)出后,通過receiver的intent-filter中的android:priority屬性來設(shè)置優(yōu)先級,優(yōu)先級從-1000~1000,數(shù)越大,優(yōu)先級越高,使用setResult()方法把結(jié)果傳遞給下一個接收者,通過getResult()方法獲取上一個接收者傳遞過來的結(jié)果,并可以通過abortBroadcast()方法丟棄該廣播,使該廣播不再傳遞給下一個接收者。

粘性廣播通過Context.sendStickBroadcast()方法來發(fā)送,用此方法發(fā)送的廣播會一直滯留,當(dāng)有匹配此廣播的接收器被注冊后,該廣播接收器就會收到此廣播。使用此廣播時,需要獲得BROADCAST_STICKY權(quán)限。(在 android 5.0/api 21后不再推薦使用)

Android系統(tǒng)中內(nèi)置了多個系統(tǒng)廣播,只要涉及到手機(jī)的基本操作,基本上都會發(fā)出相應(yīng)的系統(tǒng)廣播。如:開啟啟動,網(wǎng)絡(luò)狀態(tài)改變,拍照,屏幕關(guān)閉與開啟,點(diǎn)亮不足等等。每個系統(tǒng)廣播都具有特定的intent-filter,其中主要包括具體的action,系統(tǒng)廣播發(fā)出后,將被相應(yīng)的BroadcastReceiver接收。系統(tǒng)廣播在系統(tǒng)內(nèi)部當(dāng)特定事件發(fā)生時,有系統(tǒng)自動發(fā)出。

以上廣播都屬于全局廣播,發(fā)出去的廣播,只要有匹配的接收者,就可以收到廣播。這樣一來會造成一些問題,一是消耗性能,二是容易引起安全性的問題,為了能夠簡單的解決這方面的問題,Android引入了一套廣播本地廣播機(jī)制,使用該機(jī)制發(fā)出的廣播只能夠在本應(yīng)用內(nèi)部進(jìn)行傳遞,并且廣播接收器也只能接收來自本應(yīng)用發(fā)出的廣播。

使用方法

1.注冊本地廣播接收器

2.發(fā)送本地廣播

3.注銷本地廣播接收器

本文用到的BroadcastReceiver

Android 8.0(API級別26)取消大部分靜態(tài)注冊廣播,建議使用動態(tài)廣播

Android系統(tǒng)廣播(Broadcast)注冊,發(fā)送,接收流程解析

以下廣播簡稱Broadcast

?? 是Android四大組件之一,在四大組件的另外兩個組件 和 擁有發(fā)送和接收廣播的能力。Android 是在 進(jìn)程間通信機(jī)制的基礎(chǔ)上實(shí)現(xiàn)的,內(nèi)部基于消息發(fā)布和訂閱的事件驅(qū)動模型,廣播發(fā)送者負(fù)責(zé)發(fā)送消息,廣播接收者需要先訂閱消息,然后才能收到消息。 進(jìn)程間通信與 的區(qū)別在于:

?? 有三種類型

?? 存在一個注冊中心,也可以說是一個調(diào)度中心,即 。廣播接收者將自己注冊到 中,并指定要接收的廣播類型;廣播發(fā)送者發(fā)送廣播時,發(fā)送的廣播首先會發(fā)送到 , 根據(jù)廣播的類型找到對應(yīng)的 ,找到后邊將廣播發(fā)送給其處理。

?? 這里以普通廣播為例子, 接收者有兩種注冊方式,一種是 ,一種是 :

(廣播的發(fā)送分為 兩種,這里針對有序的廣播) 中的android:priority=""和 中的IntentFilter.setPriority(int)可以用來設(shè)置廣播接收者的優(yōu)先級,默認(rèn)都是0 , 范圍是[-1000, 1000],值越大優(yōu)先級越高,優(yōu)先級越高越早收到。

?? 在相同優(yōu)先級接收同個類型廣播時, 的廣播接收器比 的廣播接收者更快的接收到對應(yīng)的廣播,這個之后會進(jìn)行分析。

?? 注:以下源碼基于rk3399_industry Android7.1.2

?? 的流程可分為 , 和 三個部分,這里依次分析下

?? 在Android系統(tǒng)的 機(jī)制中,前面提到, 作為一個注冊和調(diào)度中心負(fù)責(zé)注冊和轉(zhuǎn)發(fā) 。所以 的注冊過程就是把它注冊到 的過程。

?? 這里我們分析 廣播的過程, 和 有一個共同的父類 ,所以它們對應(yīng)的注冊過程其實(shí)是調(diào)用 ,接下來我們按照流程逐步分析調(diào)用流程的源碼。

frameworks/base/core/java/android/content/ContextWrapper.java

?? 在之前的 Android應(yīng)用程序啟動入口ActivityThread.main流程分析 分析過,在我們啟動 Activity 時會創(chuàng)建一個 對象,然后通過 傳給我們啟動的 ,其內(nèi)部就會將該對象賦值給 ; 的 方法也是類似的賦值流程,這里放個簡易的源碼應(yīng)該更好理解

?? 可以看到最后都會將生成的 對象賦值給對應(yīng)的

對象。接下來繼續(xù)分析 , 即 函數(shù)。

/frameworks/base/core/java/android/app/ContextImpl.java

?? 這里我們首先看下如何將廣播接收者 封裝成一個 接口的 本地對象

/frameworks/base/core/java/android/app/LoadedApk.java

?? 每一個注冊過廣播接收者的 或 組件在font color='Crimson' LoadedApk /font類中都有個對應(yīng)的 對象,該對象負(fù)責(zé)將 與 組件關(guān)聯(lián)起來。這些對象,以關(guān)聯(lián)的 作為關(guān)鍵字保存在一個 中。之后對應(yīng)的 又以 的 作為關(guān)鍵字保存在 的成員變量 對象中。最后通過 對應(yīng)的 方法獲得其 接口的 本地對象。之后再回到 注冊方法內(nèi),將 對象發(fā)給 進(jìn)行注冊。

/frameworks/base/core/java/android/app/ActivityManagerNative.java

/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

?? 在的 或 注冊一個 時,并不是將其注冊到font color='OrangeRed'AMS/font中,而是將與它關(guān)聯(lián)的font color='OrangeRed'InnerReceiver/font對象注冊到font color='OrangeRed'AMS/font中,當(dāng)font color='OrangeRed'AMS/font接收到廣播時,會根據(jù) 在內(nèi)部找到對應(yīng)的font color='OrangeRed'InnerReceiver/font對象,然后在通過這個對象將這個廣播發(fā)送給對應(yīng)的 處理。

?? 注冊過程這邊畫了一個簡單的流程圖:

?? font color='OrangeRed'Broadcast/font的發(fā)送過程可簡單描述為以下幾個過程:

frameworks/base/core/java/android/content/ContextWrapper.java

/frameworks/base/core/java/android/app/ContextImpl.java

/frameworks/base/core/java/android/app/ActivityManagerNative.java

/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

Android 第六講 廣播接收器和服務(wù)

兩種方式:靜態(tài)注冊和動態(tài)注冊

動態(tài)注冊:

1)動態(tài)注冊:需要定義一個繼承自BroadcastReceiver類的子類,該接收器需要在Activity中的onDestroy中注銷

2)靜態(tài)注冊:通過在AndroidManifest.xml中配置

兩種廣播形式:有序廣播和無序廣播

1)無序廣播:接受標(biāo)準(zhǔn)廣播的接收器將同時收到廣播消息,異步執(zhí)行,沒有先后順序 sendBroadCast

2)有序廣播:sendOrderedBroadCast,按照一定順序先后被接受順序,由priority屬性決定,abortBroadCast中斷廣播

如果只想在本應(yīng)用中發(fā)送和接受廣播,使用LocalBroadcastReceiver來對廣播進(jìn)行管理

本地廣播不支持靜態(tài)注冊

優(yōu)點(diǎn) :安全高效

Service是Android中的一種組件,和Activity的級別一致,但不能自己運(yùn)行,只能后臺運(yùn)行,和其他組件交互,服務(wù)必須注冊才能使用

本地服務(wù):服務(wù)依附在主線程中,節(jié)約資源,主線程死掉服務(wù)終止

遠(yuǎn)程服務(wù):服務(wù)在獨(dú)立進(jìn)程中,靈活性好 ,占用資源高

兩種服務(wù)的啟動模式:

1)start方式:調(diào)用者和服務(wù)之間沒有關(guān)聯(lián),調(diào)用者退出不會影響服務(wù),startService啟動服務(wù),如果服務(wù)不存在,調(diào)用onCreat方法,然后onStartCommand被調(diào)用。stopService關(guān)閉服務(wù),onDestroy方法被調(diào)用

2)bind方式:調(diào)用者和服務(wù)綁定,調(diào)用者退出,服務(wù)終止bindService啟動服務(wù),onCreate方法創(chuàng)建服務(wù),onBind方法綁定服務(wù),onUnbind方法解綁,onDestory在服務(wù)結(jié)束時調(diào)用


名稱欄目:android廣播接收,Android廣播接收器
分享地址:http://weahome.cn/article/dsdeooe.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部