當前位置:首頁 » 安卓系統 » 安卓如何開發廣播

安卓如何開發廣播

發布時間: 2023-04-29 00:39:08

『壹』 Android本地廣播的使用

為了解決廣播的安全性問題,Android引入了本地廣播機制,使用該機制發出的廣播只能在應用程序的內部進行傳遞,並且廣播接收器也只能接收來自本應用程序發出的廣播。

本地廣播是無法通過靜態注冊的方式來接收的。我們知道靜態注冊主要是為了在程序未啟動的情況下能接收廣播,而當我們發送本地廣播的時候,程序肯定是已經啟動的了,所以我們需要動態注冊方式創建接收器。
在這里我們創建一個繼承於BroadcastReceiver的類LocalReceiver。onReceive()處理你接收到的廣播內容,在這里我用Toast來創建一個提示接收到消息的彈窗

在activity_main.xml文件創建一個用於發送廣播的按鈕

首先通過本地廣播管理器LocalBroadcastManager的getInstance()方法獲取一個實例,並分別創建過濾器IntentFilter和自定義接收器LocalReceiver的實例。給IntentFilter的實例添加一個action:localbroadcast(接收的廣播的名稱),然後調用LocalBroadcastManager的registerReceiver()方法進行注冊,並將LocalReceiver的實例和IntentFilter的實例都傳進去。這樣本地監聽器就創建完成了。
調用LocalBroadcastManager的sendBroadcast()發送本地廣播。運行程序,點擊Send Button按鈕,我們可以看到彈窗顯示「This is in LocalReceiver」,說明本地廣播發送和接收成功了。

當然,我們最後一定不要忘了取消注冊。我們可以通過調用unregisterReceiver()方法來實現。至此,Android的標准廣播發送就完成了。

1.發送的廣播只能在本程序內傳遞,不必擔心數據泄露
2.其它程序廣播無法發送到本程序的內部,不必擔心安全漏洞隱患
3.本地廣播比系統全局廣播更加高效

『貳』 【Android】廣播的原理及實現步驟

參考文檔(亂稿念好圖源)嘩高孝: https://www.jianshu.com/p/ca3d87a4cdf3

『叄』 Android系統廣播(Broadcast)注冊,發送,接收流程解析

以下廣播簡稱Broadcast

   是Android四大組件之一,在四大組件的另外兩個組件 和 擁有發送和接收廣播的能力。Android 是在 進程間通信機制的基礎上實現的,內部基於消息發布和訂閱的事件驅動模型,廣播發送者負責發送消息,廣播接收者需要先訂閱消息,然後才能收到消息。 進程間通信與 的區別在於:

   有三種類型

   存在一個注冊中心,也可以說是一個調度中心,即 。廣播接收者將自己注冊到 中,並指定要接收的廣播類型;廣播發送者發送廣播時,發送的廣播首先會發送到 , 根據廣播的類型找到對應的 ,找到後邊將廣播發送給其處理。

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

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

   在相同優先順序接收同個類型廣播時, 的廣播接收器比 的廣播接收者更快的接收到對應的廣播,這個之後會進行分析。

   註:以下源碼基於rk3399_instry Android7.1.2

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

   在Android系統的 機制中,前面提到, 作為一個注冊和調度中心負責注冊和轉發 。所以 的注冊過程就是把它注冊到 的過程。

   這里我們分析 廣播的過程, 和 有一個共同的父類 ,所以它們對應的注冊過程其實是調用 ,接下來我們按照流程逐步分析調用流程的源碼。

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

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

   可以看到最後都會將生成的 對象賦值給對應的
對象。接下來繼續分析 , 即 函數。

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

   這里我們首先看下如何將廣播接收者 封裝成一個 介面的 本地對象
/frameworks/base/core/java/android/app/LoadedApk.java

   每一個注冊過廣播接收者的 或 組件在<font color='Crimson'> LoadedApk </font>類中都有個對應的 對象,該對象負責將 與 組件關聯起來。這些對象,以關聯的 作為關鍵字保存在一個 中。之後對應的 又以 的 作為關鍵字保存在 的成員變數 對象中。最後通過 對應的 方法獲得其 介面的 本地對象。之後再回到 注冊方法內,將 對象發給 進行注冊。

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

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

   在的 或 注冊一個 時,並不是將其注冊到<font color='OrangeRed'>AMS</font>中,而是將與它關聯的<font color='OrangeRed'>InnerReceiver</font>對象注冊到<font color='OrangeRed'>AMS</font>中,當<font color='OrangeRed'>AMS</font>接收到廣播時,會根據 在內部找到對應的<font color='OrangeRed'>InnerReceiver</font>對象,然後在通過這個對象將這個廣播發送給對應的 處理。

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

   <font color='OrangeRed'>Broadcast</font>的發送過程可簡單描述為以下幾個過程:

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 類中的 廣播怎麼使用

首先根據廣播應用內接收和應用外接收,分類管理

LocalBroadcastManager,應用內廣播管理類
BroadcastManager 廣播管理類(部分應用內,應用外)


廣播接收類實現的兩種方式

  1. 代碼生成類,並注冊

消息發送的兩種方式

Normal broadcast,通過Context.sendBroadcast 發送,介面橡山器舉肢不按照順序,非同步處正如世理
Ordered broadcasts,通過Context.sendOrderedBroadcast發送,

由於每個接收器依次執行時,它可以傳播的結果到下一個接收器,或者它可以完全中止該廣播,以便它不會被傳遞給其他接收者。排列順序為接收器的優先順序。

『伍』 說說Android的廣播(1)

對於Activity的啟動流程,我們已經有了幾個版本的分析了。這里我們分析一個更容易一些的,四大組件中最簡單的Broadcast Receiver。

關於Broadcast,有幾點需要了解。首先是廣播的類型,然後是廣播的發送方法,最後是廣播是如何被接收的。這三者相輔相承的,比如普通廣播和有序廣播只有在詳細了解了廣播的接收過程了之後,才能真正明白它的含義。

普通的廣播是不在意順序的,最簡單的理解是同時可以收到這個廣播。如果應用是動態注冊這個廣播的,且廣播發送時這個進程還活著,那麼當然可以並發的把廣播盡快地傳送出去是最好的。
但是,如果是通過AndroidManifest.xml靜態注冊的情況,也就是說這個廣播首先要把一個進程啟動起來,這時並發啟動很多進程就是個問題了。Android目前的做法是,對這種靜態的廣播接收者,自動按有序廣播的方式來串列處理。但是這對應用是透明的,應用不能假設系統已經把靜態的無序廣播當成有序廣播來處理。

這個時候講粘性廣播有福了,因為從Android 5.0(API 21)開始,因為安全性的問題,官方已經正式廢棄了粘性廣播。

Context類提供兩個方法可以用於發送普通廣播:

差別是第二個設置許可權。

發給特定的用戶:

有序廣播因為要處理消息的處理結果,所以要復雜一些。

如果只是想讓廣播可以按優先順序來收取,並不在意處理的結果,可以用下面的版本:

同樣,在多用戶環境下,也可以選擇給哪個用戶發廣播:

不管是普通的還是有序的廣播都對應有粘性的版本:

以上的API都是定義於Context類中: https://developer.android.com/reference/android/content/Context.html

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

我們先看應用發送普通廣播的一個簡單的例子:

非常簡單,調用ContentWrapper的sendBroadcast方法就可以了。
然後我們順藤摸瓜就好了。
Activity中的sendBroadcast,實際上調用的是:

我們來看frameworks/base/core/java/android/content/ContextWrapper.java中對sendBroadcast的定義:

ContextWrapper只是一個包裝,真正的實現在ContextImpl中

我們來看/frameworks/base/core/java/android/app/ContextImpl.java中真正實現sendBroadcast的功能:

它會通過IPC去調用AMS的broadcastIntent。由於我們這個普通的廣播的方法參數最少,所以好多都是傳null。

加鎖,定參數,然後調用真正的邏輯的實現。

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

ContextWrapper.sendOrderedBroadcast

Context是abstract方法,調用的是ContextWrapper的實現:

跟普通廣播一樣,還是會調用到ContextImpl.sendOrderedBroadcast

有序廣播調用broadcastIntent的區別在於serialized參數,普通廣播為false,有序廣播為true.

原型為:

前面講過帶有回調的版本,我們看看它是如何實現的:

當然還是調用ContextImpl.sendOrderedBroadcast

這次變成只是一個封裝了,它會調用一個更多參數的版本:

這次是一個全參數調用broadcastIntent的版本了,除了sticky就齊了

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

『陸』 android怎麼發送特定廣播的

起一個線程,每發一個廣播後就sleep一分鍾,如此循環。(或者接受系統的timechanged這個廣播,這個廣播好像一分鍾發一次)。

Android 在發送廣播時的方法 sendBroadcast(Intent)。

①:Intent myIntent = new Intent();——【創建Intent對象】

②:myIntent.setAction(String)——【設置一般的要執行的動作。參數:動作一個動作的名稱,如ACTION_VIEW。應用程序的具體行動,應與供應商的包名作為前綴。】

③:myIntent.putExtra(String,Object)——【廣播中額外發送的數據,String為自定義key,Object表示多種數據類型】

④:sendBroadcast(myIntent);——【發送廣播】

接收廣播

Android在接收廣播的方法是注冊一個廣播接收器 registerReceiver(MyReceiver,IntentFilter)。

①:首先創建MyReceiver類(類名自定義) 繼承 BroadcastReceiver類。——【創建廣播接收器】

②:在MyReceiver中重寫public void onReceive(Context context, Intent intent)方法。這個方法在接收到廣播後觸發。——【重寫處理方法】

③:在Activity或者Service啟動時 onCreate()、onStartCommand()等方法中實例化 MyReceiver類——【啟動時實例化廣播接收器】

④:IntentFilter filter = new IntentFilter();——【創建IntentFilter對象 意圖過濾器】

⑤:filter.addAction(String);——【在過濾器中加入過濾條件,說明接收什麼廣播】

⑥:registerReceiver(cmdReceiver, filter);——【注冊廣播,參數為(廣播接收器,意圖過濾器)】

『柒』 簡述在android中如何發送廣播消息

1.發送廣播
Intent intent = new Intent(BroadcastAction);
Bundle bundle = new Bundle();
bundle.putString("***", SUCCESS);
bundle.putString("FullPathName", mFullPathName);
intent.putExtras(bundle);
sendBroadcast(intent);
2.在Activity中創建一個內部類MyBroadcastReceiver擴展BroadcastReceiver,並在其中實現onReceive方法。
3.在Activity中聲明一個MyBroadcastReceiver類型的成員變數,並注冊:
private MyBroadcastReceiver myBroadcastReceiver;
...
myBroadcastReceiver = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(BroadcastAction);
registerReceiver(receiver, filter);
4.使用完後要記得釋放
unregisterReceiver(receiver);

註:1和2中的 BroadcastAction要是同一個Action

『捌』 安卓開發的普通廣播的詳細流程,有誰知道嗎

簡訊廣播是有序廣播,肯定會有先後順冊凳神序的,你可以通過設置優先順序,讓一個先獲取,然粗巧後再傳遞給下一個接收。 你撲捉到後不做處理,短息還州虧是和正常那樣,會存在收件箱內,標識未讀,和正常一樣。

『玖』 Android 使用udp發送廣播

最近做項目時,遇到一個對新人我來說稍微有點麻煩的事情!

那就是使用udp協議發送廣播獲取伺服器地址

http都好說,github開源項目不知道有多少。

可是再難的問題也要去解決!

發送廣播需要許可權!

AndroidManifest.xml 中添空御加:

最少這三個是必須的,多的也迅伍忘了!
原因後面會講到

使用到RxJava:

udp發送與接受都需指定埠號
廣播地址是255.255.255.255

在之前添加許可權的時候CHANGE_WIFI_MULTICAST_STATE有添加這個
往下面看

接下來我們斗昌岩開啟接收udp信息

發送消息?

謝謝該作者的文章讓我學會udp發送
https://blog.csdn.net/tanghongchang123/article/details/53609237

熱點內容
精通腳本 發布:2025-05-20 14:42:56 瀏覽:383
東方財富經典版如何更改密碼 發布:2025-05-20 14:42:43 瀏覽:942
砸口紅解壓 發布:2025-05-20 14:41:02 瀏覽:509
配置sp失敗怎麼辦 發布:2025-05-20 14:35:08 瀏覽:178
java學到什麼程度 發布:2025-05-20 14:31:54 瀏覽:479
壓縮誤差分析 發布:2025-05-20 14:27:53 瀏覽:97
每秒上億次訪問伺服器怎麼處理 發布:2025-05-20 14:10:07 瀏覽:314
按鍵精靈資料庫操作 發布:2025-05-20 14:08:33 瀏覽:592
360瀏覽器無法訪問網路 發布:2025-05-20 14:05:13 瀏覽:834
存儲伺服器地址錯誤 發布:2025-05-20 14:01:46 瀏覽:912