當前位置:首頁 » 安卓系統 » 安卓的廣播開啟跟關閉寫在哪裡

安卓的廣播開啟跟關閉寫在哪裡

發布時間: 2023-07-08 08:13:00

⑴ android 接受開機廣播

Android接收開機廣播,需要用到播廣播接收者BroadcastReceiver組件。

具體代碼:

  1. 在配置文件AndroidManifest.xml中向系統注冊receiver

    <intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>

  2. 需要添加相應許可權

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

  3. 在Receiver中就可以添加開機需要進行的操作

    public class BootCompletedReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

    }

    }

⑵ android 注冊廣播有多少種方式

有兩種方式,一種是靜態注冊,就是在manifest文件里配置一下,這種方式注冊的廣播屬於系統級廣播。你的應用沒打開也能收到廣播。比如你要做一個收到某廣播就啟動你的應用的功能可以這樣搞。另一種是動態注冊,在代碼里執行一個rigisterBroadcastReciver(可能拼寫有誤)的方法。這種你要自己作好反注冊。這種廣播可以做成你的應用啟動後才監聽,關閉後就不監聽的效果。

⑶ 安卓開發 如何關閉廣播

很牛逼的一個問題。廣播不是用來關閉的!動態注冊廣播接收器特點是當用來注冊的Activity關掉後,廣播也就失效了。我們可以通過兩種方式注冊BroadcastReceiver,一是在Activity啟動過程中通過代碼動態注冊,二是在AndroidManifest.xml文件中利用<receiver>標簽進行靜態注冊。對於第一種方法,我們需要養成一個良好的習慣:在Activity進入停止或者銷毀狀態的時候使用unregisterReceiver方法將注冊的BroadcastReceiver注銷掉。如果通過第二種方法注冊的BroadcastReceiver,是否需要通過代碼進行注銷呢?如果通過<receiver>標簽來注冊的BroadcastReceiver,那麼該對象的實例在onReceive被調用之後就會在任意時間內被銷毀。也就是說,我們並需要擔心靜態注冊的BroadcastReceiver的銷毀問題。靜態注冊無需擔憂廣播接收器是否被關閉,只要設備是開啟狀態,廣播接收器也是打開著的。也就是說哪怕app本身未啟動,該app訂閱的廣播在觸發時也會對它起作用。

⑷ Android開機過程中什麼時候發開機廣播

Android開機過程漏正中發開機廣播如下:
intent的發送點是在:
finishBooting函數(ActivityManagerService.java
調用關返睜悔系是:
startHomeActivityLocked()
-> ensureBootCompleted()
-> finishBooting()
-> mStackSupervisor.startHomeActivity(intent, aInfo)
所以系統發出這個intent的時候 ,home界面並沒有起來,發出之後很短的時間 home就啟動,在配置文件AndroidManifest.xml中向系統注冊receiver,子節點 intent-filter 表示接收android.intent.action.BOOT_COMPLETED 消息
<receiver android:name="com.ray.ray.receiver.BootCompletedReceiver" >
<早蘆intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>

⑸ android藍牙BLE(三) —— 廣播

​ 在藍牙開發中,有些情況是不需要連接的,只要外設廣播自己的數據即可,例如蘋果的 ibeacon 。自 Android 5.0 更新藍牙API後,手機可以作為外設廣播數據。

廣播包有兩種:

其中 廣播包是每個外設都必須廣播的,而響應包是可選的 。每個廣播包的長度必須是 31個位元組 ,如果不到 31個位元組 ,則剩下的全用 0 填充 補全,這部分的數據是無效的

廣播包中包含若干個廣播數據單元,廣播數據單元也稱為 AD Structure 。

廣播數據單元 = 長度值Length + AD type + AD Data。

長度值 Length 只佔 一個位元組 ,並且位於廣播數據單元的 第一個位元組

概念的東西有些抽象,先看看下面的廣播報文:

​ 0x代表這串字元串是十六進制的字元串。 兩位十六進制數代表一個位元組 。因為兩個字元組成的十六進制字元串最大為 FF ,即255,而Java中byte類型的取值范圍是-128到127,剛好可以表示一個255的大小。所以兩個十六進制的字元串表示一個位元組。

​ 繼續查看報文內容,開始讀取第一個廣播數據單元。讀取 第一個 位元組: 0x07 ,轉換為十進制就是7,即表示後面的7個位元組是這個廣播數據單元的數據內容。超過這7個位元組的數據內容後,表示是一個新的廣播數據單元。

​ 而第二個廣播數據單元,第一個位元組的值是 0x16 ,轉換為十進制就是22,表示後面22個位元組為第二個廣播數據單元。

​ 在廣播數據單元的 數據部分 中, 第一個位元組 代表 數據類型 (AD type),決定數據部分表示的是什麼數據。(即廣播數據單元第二個位元組為AD type)

AD Type 的類型如下:

​ 這bit 1~7分別代表著發送該廣播的藍牙晶元的物理連接狀態。當bit的值為1時,表示支持該功能。
例:

藍牙廣播的數據格式大致講了一下,有助於下面的廣播操作的理解。

先看看廣播設置( AdvertiseSettings )如何定義:

(1)、通過 AdvertiseSettings.Builder#setAdvertiseMode() 設置廣播模式。其中有3種模式:

(2)、通過 AdvertiseSettings.Builder#setAdvertiseMode() 設置廣播發射功率。共有4種功率模式:

(3)、通過 AdvertiseSettings.Builder#setTimeout() 設置持續廣播的時間,單位為毫秒。最多180000毫秒。當值為0則無時間限制,持續廣播,除非調用 BluetoothLeAdvertiser#stopAdvertising() 停止廣播。

(4)、通過 AdvertiseSettings.Builder#setConnectable() 設置該廣播是否可以連接的。

之前說過,外設必須廣播廣播包,掃描包是可選。但添加掃描包也意味著廣播更多得數據,即可廣播62個位元組。

可見無論是廣播包還是掃描包,其廣播的內容都是用 AdvertiseData 類封裝的。

(1)、 AdvertiseData.Builder#setIncludeDeviceName() 方法,可以設置廣播包中是否包含藍牙的名稱。

(2)、 AdvertiseData.Builder#setIncludeTxPowerLevel() 方法,可以設置廣播包中是否包含藍牙的發射功率。

(3)、 AdvertiseData.Builder#addService UUID (Parcel UUID ) 方法,可以設置特定的 UUID 在廣播包中。

(4)、 AdvertiseData.Builder#addServiceData(Parcel UUID ,byte[]) 方法,可以設置特定的 UUID 和其數據在廣播包中。

(5)、 AdvertiseData.Builder#addManufacturerData(int,byte[]) 方法,可以設置特定廠商Id和其數據在廣播包中。

​ 從 AdvertiseData.Builder 的設置中可以看出,如果一個外設需要在不連接的情況下對外廣播數據,其數據可以存儲在 UUID 對應的數據中,也可以存儲在廠商數據中。但由於廠商ID是需要由Bluetooth SIG進行分配的,廠商間一般都將數據設置在廠商數據。

另外可以通過 BluetoothAdapter#setName() 設置廣播的名稱

先看一個例子,我們分別在 廣播包 掃描包 中設置 AdvertiseData.Builder 的 每一種廣播報文參數 ,得到一下報文內容:

(1)、Type = 0x01 表示設備LE物理連接。

(2)、Type = 0x09 表示設備的全名

(3)、Type = 0x03 表示完整的16bit UUID 。其值為0xFFF7。

(4)、Type = 0xFF 表示廠商數據。前兩個位元組表示廠商ID,即廠商ID為0x11。後面的為廠商數據,具體由用戶自行定義。

(5)、Type = 0x16 表示16 bit UUID 的數據,所以前兩個位元組為 UUID ,即 UUID 為0xF117,後續為 UUID 對應的數據,具體由用戶自行定義。

最後繼承 AdvertiseCallback 自定義廣播回調。

初始化完畢上面的對象後,就可以進行廣播:

​ 廣播主要是通過 BluetoothLeAdvertiser#startAdvertising() 方法實現,但在之前需要先獲取 BluetoothLeAdvertiser 對象。

BluetoothLeAdvertiser 對象存在兩個情況獲取為Null:

所以在調用 BluetoothAdapter#getBluetoothLeAdvertiser() 前,需要先調用判斷藍牙已開啟,並判斷在 BluetoothAdapter 中獲取的 BluetoothLeAdvertiser 是否為空(測試過某些華為手機 mBluetoothAdapter.() 為 false , 但是能發送ble廣播)。

​ 與廣播成對出現就是 BluetoothLeAdvertiser.stopAdvertising() 停止廣播了,傳入開啟廣播時傳遞的廣播回調對象,即可關閉廣播:

​ 雖然通過廣播告知外邊自身擁有這些Service,但手機自身並沒有初始化Gattd的Service。導致外部的中心設備連接手機後,並不能找到對應的 GATT Service 和 獲取對應的數據。

Service類型有兩個級別:

創建 BluetoothGattService 時,傳入兩個參數: UUID 和Service類型:

​ 我們都知道Gatt中, Service 的下一級是 Characteristic , Characteristic 是最小的通信單元,通過對 Characteristic 進行讀寫操作來進行通信。

​ 特徵屬性表示該 BluetoothGattCharacteristic 擁有什麼功能,即能對 BluetoothGattCharacteristic 進行什麼操作。其中主要有3種:

許可權屬性用於配置該特徵值所具有的功能。主要兩種:

Characteristic 下還有 Descriptor ,初始化 BluetoothGattDescriptor 時傳入: Descriptor UUID 和 許可權屬性

為 Service 添加 Characteristic ,為 Characteristic 添加 Descriptor :

​ 通過藍牙管理器 mBluetoothManager 獲取 Gatt Server ,用來添加 Gatt Service 。添加完 Gatt Service 後,外部中心設備連接手機時,將能獲取到對應的 GATT Service 和 獲取對應的數據

​ 定義 Gatt Server 回調。當中心設備連接該手機外設、修改特徵值、讀取特徵值等情況時,會得到相應情況的回調。

最後開啟廣播後,用nRF連接後看到的特徵值信息如下圖所示:(加多了一個只能都的特徵值)

android藍牙BLE(一) —— 掃描

android藍牙BLE(二) —— 通信

android藍牙BLE(三) —— 廣播

android藍牙BLE(四) —— 實戰

⑹ Android BroadcastReceiver詳解

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

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

這是一種同步執行的廣播,通過Context.sendOrderedBroadcast()方法發送,這種廣播發出後,通過receiver的intent-filter中的android:priority屬性來設置優先順序,優先順序從-1000~1000,數越大,優先順序越高,使用setResult()方法把結果傳遞給下一個接收者,通過getResult()方法獲取上一個接收者傳遞過來的結果,並可以通過abortBroadcast()方法丟棄該廣播,使該廣播不再傳遞給下一個接收者。

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

Android系統中內置了多個系統廣播,只要涉及到手機的基本操作,基本上都會發出相應的系統廣播。如:開啟啟動,網路狀態改變,拍照,屏幕關閉與開啟,點亮不足等等。每個系統廣播都具有特定的intent-filter,其中主要包括具體的action,系統廣播發出後,將被相應的BroadcastReceiver接收。系統廣播在系統內部當特定事件發生時,有系統自動發出。

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

使用方法
1.注冊本地廣播接收器

2.發送本地廣播

3.注銷本地廣播接收器

本文用到的BroadcastReceiver

Android 8.0(API級別26)取消大部分靜態注冊廣播,建議使用動態廣播
https://developer.android.google.cn/about/versions/oreo/android-8.0

熱點內容
如何編譯java文件 發布:2025-02-06 12:05:58 瀏覽:234
九九乘法編程 發布:2025-02-06 12:05:05 瀏覽:516
台式機忘記開機密碼怎麼辦 發布:2025-02-06 11:58:01 瀏覽:868
android刷新按鈕 發布:2025-02-06 11:57:17 瀏覽:585
存儲過程有輸入參數和輸出參數 發布:2025-02-06 11:55:32 瀏覽:96
成績評選演算法 發布:2025-02-06 11:42:51 瀏覽:994
資料庫測試數據 發布:2025-02-06 11:31:05 瀏覽:821
球頭軸編程 發布:2025-02-06 11:29:36 瀏覽:280
為什麼安卓系統不能收縮許可權 發布:2025-02-06 11:27:58 瀏覽:730
演算法4視頻 發布:2025-02-06 11:19:20 瀏覽:934