欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

android發(fā)送廣播,android發(fā)送廣播代碼

Android 使用udp發(fā)送廣播

最近做項(xiàng)目時(shí),遇到一個(gè)對(duì)新人我來(lái)說(shuō)稍微有點(diǎn)麻煩的事情!

創(chuàng)新互聯(lián)公司主營(yíng)揭陽(yáng)網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,app開發(fā)定制,揭陽(yáng)h5成都小程序開發(fā)搭建,揭陽(yáng)網(wǎng)站營(yíng)銷推廣歡迎揭陽(yáng)等地區(qū)企業(yè)咨詢

那就是使用udp協(xié)議發(fā)送廣播獲取服務(wù)器地址!

http都好說(shuō),github開源項(xiàng)目不知道有多少。

可是再難的問(wèn)題也要去解決!

發(fā)送廣播需要權(quán)限!

AndroidManifest.xml 中添加:

最少這三個(gè)是必須的,多的也忘了!

原因后面會(huì)講到

使用到RxJava:

udp發(fā)送與接受都需指定端口號(hào)

廣播地址是255.255.255.255

在之前添加權(quán)限的時(shí)候CHANGE_WIFI_MULTICAST_STATE有添加這個(gè)

往下面看

接下來(lái)我們開啟接收udp信息

發(fā)送消息?

謝謝該作者的文章讓我學(xué)會(huì)udp發(fā)送

說(shuō)說(shuō)Android的廣播(1)

對(duì)于Activity的啟動(dòng)流程,我們已經(jīng)有了幾個(gè)版本的分析了。這里我們分析一個(gè)更容易一些的,四大組件中最簡(jiǎn)單的Broadcast Receiver。

關(guān)于Broadcast,有幾點(diǎn)需要了解。首先是廣播的類型,然后是廣播的發(fā)送方法,最后是廣播是如何被接收的。這三者相輔相承的,比如普通廣播和有序廣播只有在詳細(xì)了解了廣播的接收過(guò)程了之后,才能真正明白它的含義。

普通的廣播是不在意順序的,最簡(jiǎn)單的理解是同時(shí)可以收到這個(gè)廣播。如果應(yīng)用是動(dòng)態(tài)注冊(cè)這個(gè)廣播的,且廣播發(fā)送時(shí)這個(gè)進(jìn)程還活著,那么當(dāng)然可以并發(fā)的把廣播盡快地傳送出去是最好的。

但是,如果是通過(guò)AndroidManifest.xml靜態(tài)注冊(cè)的情況,也就是說(shuō)這個(gè)廣播首先要把一個(gè)進(jìn)程啟動(dòng)起來(lái),這時(shí)并發(fā)啟動(dòng)很多進(jìn)程就是個(gè)問(wèn)題了。Android目前的做法是,對(duì)這種靜態(tài)的廣播接收者,自動(dòng)按有序廣播的方式來(lái)串行處理。但是這對(duì)應(yīng)用是透明的,應(yīng)用不能假設(shè)系統(tǒng)已經(jīng)把靜態(tài)的無(wú)序廣播當(dāng)成有序廣播來(lái)處理。

這個(gè)時(shí)候講粘性廣播有福了,因?yàn)閺腁ndroid 5.0(API 21)開始,因?yàn)榘踩缘膯?wèn)題,官方已經(jīng)正式廢棄了粘性廣播。

Context類提供兩個(gè)方法可以用于發(fā)送普通廣播:

差別是第二個(gè)設(shè)置權(quán)限。

發(fā)給特定的用戶:

有序廣播因?yàn)橐幚硐⒌奶幚斫Y(jié)果,所以要復(fù)雜一些。

如果只是想讓廣播可以按優(yōu)先級(jí)來(lái)收取,并不在意處理的結(jié)果,可以用下面的版本:

同樣,在多用戶環(huán)境下,也可以選擇給哪個(gè)用戶發(fā)廣播:

不管是普通的還是有序的廣播都對(duì)應(yīng)有粘性的版本:

以上的API都是定義于Context類中:

首先我們先看看發(fā)送端是如何發(fā)送的。

我們首先先放一個(gè)大圖,讓大家先有一個(gè)直觀的印象,不管普通廣播、有序廣播、粘性廣播如何組合,最終都匯集到一個(gè)大方法中。

我們先看應(yīng)用發(fā)送普通廣播的一個(gè)簡(jiǎn)單的例子:

非常簡(jiǎn)單,調(diào)用ContentWrapper的sendBroadcast方法就可以了。

然后我們順藤摸瓜就好了。

Activity中的sendBroadcast,實(shí)際上調(diào)用的是:

我們來(lái)看frameworks/base/core/java/android/content/ContextWrapper.java中對(duì)sendBroadcast的定義:

ContextWrapper只是一個(gè)包裝,真正的實(shí)現(xiàn)在ContextImpl中

我們來(lái)看/frameworks/base/core/java/android/app/ContextImpl.java中真正實(shí)現(xiàn)sendBroadcast的功能:

它會(huì)通過(guò)IPC去調(diào)用AMS的broadcastIntent。由于我們這個(gè)普通的廣播的方法參數(shù)最少,所以好多都是傳null。

加鎖,定參數(shù),然后調(diào)用真正的邏輯的實(shí)現(xiàn)。

我們先把broadcastIntentLocked的真正邏輯放一下,先看看有序廣播是如何發(fā)送的。

ContextWrapper.sendOrderedBroadcast

Context是abstract方法,調(diào)用的是ContextWrapper的實(shí)現(xiàn):

跟普通廣播一樣,還是會(huì)調(diào)用到ContextImpl.sendOrderedBroadcast

有序廣播調(diào)用broadcastIntent的區(qū)別在于serialized參數(shù),普通廣播為false,有序廣播為true.

原型為:

前面講過(guò)帶有回調(diào)的版本,我們看看它是如何實(shí)現(xiàn)的:

當(dāng)然還是調(diào)用ContextImpl.sendOrderedBroadcast

這次變成只是一個(gè)封裝了,它會(huì)調(diào)用一個(gè)更多參數(shù)的版本:

這次是一個(gè)全參數(shù)調(diào)用broadcastIntent的版本了,除了sticky就齊了

我們也不繞圈子了,直接看ContextImpl.sendStickyBroadcast.

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

以下廣播簡(jiǎn)稱Broadcast

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

?? 有三種類型

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

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

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

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

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

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

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

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

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

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

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

對(duì)象。接下來(lái)繼續(xù)分析 , 即 函數(shù)。

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

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

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

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

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

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

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

?? 注冊(cè)過(guò)程這邊畫了一個(gè)簡(jiǎn)單的流程圖:

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

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èn)題,Android引入了本地廣播機(jī)制,使用該機(jī)制發(fā)出的廣播只能在應(yīng)用程序的內(nèi)部進(jìn)行傳遞,并且廣播接收器也只能接收來(lái)自本應(yīng)用程序發(fā)出的廣播。

本地廣播是無(wú)法通過(guò)靜態(tài)注冊(cè)的方式來(lái)接收的。我們知道靜態(tài)注冊(cè)主要是為了在程序未啟動(dòng)的情況下能接收廣播,而當(dāng)我們發(fā)送本地廣播的時(shí)候,程序肯定是已經(jīng)啟動(dòng)的了,所以我們需要?jiǎng)討B(tài)注冊(cè)方式創(chuàng)建接收器。

在這里我們創(chuàng)建一個(gè)繼承于BroadcastReceiver的類LocalReceiver。onReceive()處理你接收到的廣播內(nèi)容,在這里我用Toast來(lái)創(chuàng)建一個(gè)提示接收到消息的彈窗

在activity_main.xml文件創(chuàng)建一個(gè)用于發(fā)送廣播的按鈕

首先通過(guò)本地廣播管理器LocalBroadcastManager的getInstance()方法獲取一個(gè)實(shí)例,并分別創(chuàng)建過(guò)濾器IntentFilter和自定義接收器LocalReceiver的實(shí)例。給IntentFilter的實(shí)例添加一個(gè)action:localbroadcast(接收的廣播的名稱),然后調(diào)用LocalBroadcastManager的registerReceiver()方法進(jìn)行注冊(cè),并將LocalReceiver的實(shí)例和IntentFilter的實(shí)例都傳進(jìn)去。這樣本地監(jiān)聽器就創(chuàng)建完成了。

調(diào)用LocalBroadcastManager的sendBroadcast()發(fā)送本地廣播。運(yùn)行程序,點(diǎn)擊Send Button按鈕,我們可以看到彈窗顯示“This is in LocalReceiver”,說(shuō)明本地廣播發(fā)送和接收成功了。

當(dāng)然,我們最后一定不要忘了取消注冊(cè)。我們可以通過(guò)調(diào)用unregisterReceiver()方法來(lái)實(shí)現(xiàn)。至此,Android的標(biāo)準(zhǔn)廣播發(fā)送就完成了。

1.發(fā)送的廣播只能在本程序內(nèi)傳遞,不必?fù)?dān)心數(shù)據(jù)泄露

2.其它程序廣播無(wú)法發(fā)送到本程序的內(nèi)部,不必?fù)?dān)心安全漏洞隱患

3.本地廣播比系統(tǒng)全局廣播更加高效

Android BroadcastReceiver詳解

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

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

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

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

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

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

使用方法

1.注冊(cè)本地廣播接收器

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

3.注銷本地廣播接收器

本文用到的BroadcastReceiver

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

網(wǎng)站題目:android發(fā)送廣播,android發(fā)送廣播代碼
當(dāng)前鏈接:http://chinadenli.net/article30/dseiipo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序網(wǎng)站策劃自適應(yīng)網(wǎng)站企業(yè)建站面包屑導(dǎo)航App開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)