導航:首頁 > 操作系統 > android指定廣播

android指定廣播

發布時間:2022-10-17 00:36:01

1. android中的廣播是什麼意思

android的廣播概念和我們日常生活中的電台有相通之處,空氣中有不同頻段,不同電台的廣播,而android系統中就有對應的電池的電量,來電,簡訊還有例如sd卡拔插等等這些廣播的消息發出,這些消息就對應著用收音機調頻時,不同電台的節目。而我們注冊的廣播就類似於我收聽某個電台的節目,比如一個注冊廣播收聽交通廣播,另一個注冊的廣播收聽音樂廣播,那麼怎麼區分是交通廣播還是音樂廣播呢,這就要通過前一章提到的Intent的action來判斷。

2. android 如何自定義常駐廣播

Android廣播機制指的是,在一個應用程序運行的時候可以自定義一個消息類型,讓相應的接收器去處理這個消息或者是系統消息,比如來電話了、來簡訊了、手機沒電了等等系統發送的消息。系統發送的消息也可以通過廣播的方式通知給應用程序,這樣子就避免了新開一個Thread去監聽系統或其他應用發送過來的消息的狀態。

Android廣播的分類:
1、 普通廣播:這種廣播可以依次傳遞給各個處理器去處理
2、 有序廣播:這種廣播在處理器端的處理順序是按照處理器的不同優先順序來區分的,高優先順序的處理器會優先截獲這個消息,並且可以將這個消息刪除
3、 粘性消息:粘性消息在發送後就一直存在於系統的消息容器裡面,等待對應的處理器去處理,如果暫時沒有處理器處理這個消息則一直在消息容器裡面處於等待狀態。
注意:普通廣播和粘性消息不同被截獲,而有序廣播是可以被截獲的

處理器的注冊:
1、 在代碼中用函數代碼動態的方式注冊。動態注冊的處理器必須用代碼動態的銷毀,每次用來處理消息的就一個實例對象
2、 在配置文件裡面靜態注冊,靜態注冊有個特點,那就是一旦注冊就會一直存在於系統裡面,無論應用是否關閉或開關機。(簡直就是一個流氓軟體病毒啊~)。靜態注冊每次有處理消息就由系統new一個處理器處理,並銷毀
下面具體看看Android廣播消息的發送、注冊、處理過程:
① 自定義處理器類:

public class MyBroadcastReceiver4 extends BroadcastReceiver {
public MyBroadcastReceiver4() {
System.out.println("創建了一個由registerReceiver()注冊的廣播接收器");
}

@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
System.out.println("MyBroadcastReceiver4收到了一個" + action + "消息");
if (isOrderedBroadcast()) {
System.out.println("這是一個有序廣播,已經被攔截了。");
this.abortBroadcast();
} else {
System.out.println("這不是一個有序廣播");
}

Bundle bundle = intent.getExtras();
if (bundle != null) {
System.out.println("該消息攜帶的數據如下:");
// 獲得bundle的一個key的集合
Set set = bundle.keySet();
// 獲得上述集合的迭代器
Iterator iterator = set.iterator();
// 用迭代器遍歷集合
while (iterator.hasNext()) {
// 取得集合中的一個內容
String str = (String) iterator.next();
// 取得Bundle中的內容
System.out.println(str + "--->" + bundle.get(str));
}
} else {
System.out.println("該消息沒有攜帶數據");
}

Toast toast = Toast.makeText(context, "MyBroadcastReceiver4收到了一個"
+ action + "消息", Toast.LENGTH_LONG);
toast.show();
//將這個消息截獲(從消息容器移除)這樣其他處理器就沒法接收到這個消息
this.abortBroadcast();
}
}

② 發送廣播消息

⑴、 發送普通廣播:
// 發送一個普通消息
Intent intent = new Intent(); intent.setAction("asdfasdf");
Android_09_10Activity.this.sendBroadcast(intent);

⑵、 發送有序廣播:
// 發送一個有序消息
Intent intent = new Intent();
intent.setAction("asdfasdf"); Android_09_10Activity.this.sendOrderedBroadcast(intent,
null);
⑶、 發送粘性廣播:
// 發送一個粘性消息
Intent intent = new Intent();
intent.setAction("qwerqwer"); Android_09_10Activity.this.sendStickyBroadcast(intent);
③ 注冊廣播接收器
⑴動態注冊:
// 注冊一個廣播接收器
IntentFilter intentFilter = new IntentFilter("asdfasdf");
intentFilter.setPriority(0);
Android_09_10Activity.this.registerReceiver(mbr2,
intentFilter);
⑵靜態注冊:

<receiver android:name=".MyBroadcastReceiver4" >

<intent-filter android:priority="1000" >

<action android:name="android.intent.action.WALLPAPER_CHANGED" />

<action android:name="android.provider.Telephony.SMS_RECEIVED" />

<action android:name="android.intent.action.PHONE_STATE" />

<action android:name="android.intent.action.PACKAGE_REMOVED" />

//這一句比較特殊,是上面那個廣播消息特有的

<data android:scheme="package" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>

想發送粘性消息的時候必須在配置文件裡面獲取許可權:
<uses-permission android:name="android.permission.BROADCAST_STICKY" />

想用自定義處理器對系統廣播進行處理的話也必須在注冊文件裡面申明獲取許可權,比如:
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

3. 22 AndroidBroadcast廣播機制

廣播(Broadcast)機制用於進程/線程間通信,廣播分為廣播發送和廣播接收兩個過程,其中廣播接收者BroadcastReceiver便是Android四大組件之一。

BroadcastReceiver分為兩類:

從廣播發送方式可分為三類:

廣播在系統中以BroadcastRecord對象來記錄, 該對象有幾個時間相關的成員變數.

廣播注冊,對於應用開發來說,往往是在Activity/Service中調用 registerReceiver() 方法,而Activity或Service都間接繼承於Context抽象類,真正幹活是交給ContextImpl類。另外調用getOuterContext()可獲取最外層的調用者Activity或Service。

[ContextImpl.java]

其中broadcastPermission擁有廣播的許可權控制,scheler用於指定接收到廣播時onRecive執行線程,當scheler=null則默認代表在主線程中執行,這也是最常見的用法

[ContextImpl.java]

ActivityManagerNative.getDefault()返回的是ActivityManagerProxy對象,簡稱AMP.
該方法中參數有mMainThread.getApplicationThread()返回的是ApplicationThread,這是Binder的Bn端,用於system_server進程與該進程的通信。

[-> LoadedApk.java]

不妨令 以BroadcastReceiver(廣播接收者)為key,LoadedApk.ReceiverDispatcher(分發者)為value的ArrayMap 記為 A 。此處 mReceivers 是一個以 Context 為key,以 A 為value的ArrayMap。對於ReceiverDispatcher(廣播分發者),當不存在時則創建一個。

此處mActivityThread便是前面傳遞過來的當前主線程的Handler.

ReceiverDispatcher(廣播分發者)有一個內部類 InnerReceiver ,該類繼承於 IIntentReceiver.Stub 。顯然,這是一個Binder服務端,廣播分發者通過rd.getIIntentReceiver()可獲取該Binder服務端對象 InnerReceiver ,用於Binder IPC通信。

[-> ActivityManagerNative.java]

這里有兩個Binder服務端對象 caller 和 receiver ,都代表執行注冊廣播動作所在的進程. AMP通過Binder驅動將這些信息發送給system_server進程中的AMS對象,接下來進入AMS.registerReceiver。

[-> ActivityManagerService.java]

其中 mRegisteredReceivers 記錄著所有已注冊的廣播,以receiver IBinder為key, ReceiverList為value為HashMap。

在BroadcastQueue中有兩個廣播隊列mParallelBroadcasts,mOrderedBroadcasts,數據類型都為ArrayList<broadcastrecord style="box-sizing: border-box;">:</broadcastrecord>

mLruProcesses數據類型為 ArrayList<ProcessRecord> ,而ProcessRecord對象有一個IApplicationThread欄位,根據該欄位查找出滿足條件的ProcessRecord對象。

該方法用於匹配發起的Intent數據是否匹配成功,匹配項共有4項action, type, data, category,任何一項匹配不成功都會失敗。

broadcastQueueForIntent(Intent intent)通過判斷intent.getFlags()是否包含FLAG_RECEIVER_FOREGROUND 來決定是前台或後台廣播,進而返回相應的廣播隊列mFgBroadcastQueue或者mBgBroadcastQueue。

注冊廣播:

另外,當注冊的是Sticky廣播:

廣播注冊完, 另一個操作便是在廣播發送過程.

發送廣播是在Activity或Service中調用 sendBroadcast() 方法,而Activity或Service都間接繼承於Context抽象類,真正幹活是交給ContextImpl類。

[ContextImpl.java]

[-> ActivityManagerNative.java]

[-> ActivityManagerService.java]

broadcastIntent()方法有兩個布爾參數serialized和sticky來共同決定是普通廣播,有序廣播,還是Sticky廣播,參數如下:

broadcastIntentLocked方法比較長,這里劃分為8個部分來分別說明。

這個過程最重要的工作是:

BroadcastReceiver還有其他flag,位於Intent.java常量:

主要功能:

這個過主要處於系統相關的10類廣播,這里不就展開講解了.

這個過程主要是將sticky廣播增加到list,並放入mStickyBroadcasts裡面。

其他說明:

AMS.collectReceiverComponents

廣播隊列中有一個成員變數 mParallelBroadcasts ,類型為ArrayList<broadcastrecord style="box-sizing: border-box;">,記錄著所有的並行廣播。</broadcastrecord>

動態注冊的registeredReceivers,全部合並都receivers,再統一按串列方式處理。

廣播隊列中有一個成員變數 mOrderedBroadcasts ,類型為ArrayList<broadcastrecord style="box-sizing: border-box;">,記錄著所有的有序廣播。</broadcastrecord>

發送廣播過程:

處理方式:

可見不管哪種廣播方式,都是通過broadcastQueueForIntent()來根據intent的flag來判斷前台隊列或者後台隊列,然後再調用對應廣播隊列的scheleBroadcastsLocked方法來處理廣播;

在發送廣播過程中會執行 scheleBroadcastsLocked 方法來處理相關的廣播

[-> BroadcastQueue.java]

在BroadcastQueue對象創建時,mHandler=new BroadcastHandler(handler.getLooper());那麼此處交由mHandler的handleMessage來處理:

由此可見BroadcastHandler採用的是」ActivityManager」線程的Looper

[-> BroadcastQueue.java]

此處mService為AMS,整個流程還是比較長的,全程持有AMS鎖,所以廣播效率低的情況下,直接會嚴重影響這個手機的性能與流暢度,這里應該考慮細化同步鎖的粒度。

4. 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);——【注冊廣播,參數為(廣播接收器,意圖過濾器)】

5. 安卓廣播接收器怎麼判斷是哪個應用發送的想要只接收自身應用廣播,怎麼實現

安卓廣播接收器Intent,它有提供過濾器功能,也就是開發者定義過濾條件,只有是這個條件的廣播才接收,這樣就可以接收指定廣播。這也是安卓廣播的基礎知識功能,具體自己查閱相關資料,很簡單的。

6. 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

7. 【Android】廣播的原理及實現步驟

參考文檔(圖源): https://www.jianshu.com/p/ca3d87a4cdf3

8. 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(四) —— 實戰

9. android中自定義廣播需要哪個許可權

接受者的清單文件:
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.permissionbroadcastreceiver">

<permission android:name="com.example.broadcast.permission"
android:protectionLevel="normal" />
<application android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".PermissionRecevicer"
android:permission="com.example.broadcast.permission">
<intent-filter>
<action android:name="com.example.permissionbroadcastreceiver.message" />
</intent-filter>
</receiver>
</application></manifest>

在清單文件中聲明一個許可權,然後在receiver中要求發送者具有此許可權,這樣廣播接受者進程就算是准備完成了!!
廣播發送者的清單文件:
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.permissionbroadcast">

<uses-permission android:name="com.example.broadcast.permission" />
<application android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application></manifest>

在清單文件請求剛才在接收者清單文件聲明的許可權即可,這里的運行結果就不展示了,只是log而已!!!

10. 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指定廣播相關的資料

熱點內容
鄧倫參加密室逃脫視頻 瀏覽:391
音頻壓縮編碼標准 瀏覽:300
常提到的app是表示什麼 瀏覽:261
天津程序員傳銷 瀏覽:349
下班之後的程序員 瀏覽:71
檢測支持ssl加密演算法 瀏覽:344
衢州發布新聞什麼APP 瀏覽:85
中國移動長沙dns伺服器地址 瀏覽:251
wifi密碼加密了怎麼破解嗎 瀏覽:598
linux命令cpu使用率 瀏覽:67
linux實用命令 瀏覽:240
傳奇引擎修改在線時間命令 瀏覽:110
php取域名中間 瀏覽:898
cad命令欄太小 瀏覽:830
php開發環境搭建eclipse 瀏覽:484
qt文件夾名稱大全 瀏覽:215
金山雲伺服器架構 瀏覽:233
安卓系統筆記本怎麼切換系統 瀏覽:622
u盤加密快2個小時還沒有搞完 瀏覽:95
小米有品商家版app叫什麼 瀏覽:96