一、廣播的發送
經常說”發送廣播“和”接收“,表面上看廣播作為Android廣播機制中的實體,實際上這一實體本身是并不是以所謂的”廣播“對象存在的,而是以”意圖“(Intent
)去表示。定義廣播的定義過程,實際就是相應廣播”意圖“的定義過程,然后通過廣播發送者將此”意圖“發送出去。被相應的BroadcastReceiver
接收后將會回調onReceive()
函數。
下段代碼片段顯示的是一個普通廣播的定義過程,并發送出去。其中setAction()
對應于BroadcastReceiver
中的intentFilter
中的action
。
Intent intent = new Intent();
intent.setAction(BROADCAST_ACTION);
sendBroadcast(intent);
根據不同類型的廣播調用相對應的send方法。
- 普通廣播(
NormalBroadcast
):sendBroadcast(Intent)(Intent, String)
- 有序廣播(
OrderedBroadcast
):sendOrderedBroadcast(Intent, String)
- 系統廣播(
SystemBroadcast
):發生各種事件時,系統自動發送 - 本地廣播(
LocalBroadcast
):LocalBroadcastManager.sendBroadcast(intent)
- 粘性廣播(
StickyBroadcast
):已棄用(API 21)
具體類型可查看《BroadcastReceiver-廣播(四)五種類型》
二、自定義廣播權限
2.1、自定義一個廣播權限
- 在
AndroidManifest.xml
中,聲明一個權限,名為com.example.receiver.receivebroadcast:
<permission
android:name="com.example.receiver.receivebroadcast"
android:label="BroadcastReceiverPermission"
android:protectionLevel="signature">
</permission>
<!--聲明要使用的權限-->
<users-permission android:name="com.example.receiver.receivebroadcast"/>
- 在自定義權限時,通常會指定
android:protectionLevel
屬性,常用的如下:
- normal:默認的,應用安裝前,用戶可以看到相應的權限,但無需用戶主動授權。
- dangerous:
normal
安全級別控制以外的任何危險操作。需要dangerous
級別權限時,Android會明確要求用戶進行授權。常見的如:網絡使用權限,相機使用權限及聯系人信息使用權限等。- signature:它要求權限聲明應用和權限使用應用使用相同的
keystore
進行簽名。如果使用同一keystore
,則該權限由系統授予,否則系統會拒絕。并且權限授予時,不會通知用戶。它常用于應用內部。把protectionLevel
聲明為signature
。如果別的應用使用的不是同一個簽名文件,就沒辦法使用該權限,從而保護了自己的接收者。
2.2、設置廣播接收者
- 采用靜態方式:
在接收方的AndroidManifest.xml
中,聲明一個權限,名為com.example.receiver.receivebroadcast:
<receiver
android:name=".MBroadcastReceiver"
android:exported="false"
android:permission="com.example.receiver.receivebroadcast">
<intent-filter>
<action android:name="BROADCAST_ACTION"/>
</intent-filter>
</receiver>
- 采用動態方式:
// 注冊廣播代碼
MBroadcastReceiver receiver = new MBroadcastReceiver ();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(BROADCAST_ACTION);
//注冊receiver時,直接指定發送者應該具有的權限。不然外部應用依舊可以觸及到receiver
registerReceiver(receiver, intentFilter, "com.example.receiver.receivebroadcast", null);
// 發送廣播代碼
Intent intent = new Intent();
intent.setAction(BROADCAST_ACTION);
sendBroadcast(intent, "com.example.receiver.receivebroadcast");
在注冊的時候,最關鍵的一點是用registerReceiver()
進行注冊,而不是平常用的是registerReceiver()
。相較于后者,前者在注冊的時候要求了發送者必須具有的權限。如果發送者沒有該權限,那么發送者發送的廣播即使經過IntentFilter
的過濾,也不會被receiver
接收。此時如果再自定義一個權限,并且將權限的protectionLevel
設置為signature
,那么外部應用便無法使用該權限,也就無法觸及到該receiver
。
BroadcastReceiver-廣播系列
《BroadcastReceiver-廣播(一)實現原理及注冊》
《BroadcastReceiver-廣播(二)靜態注冊屬性說明》
《BroadcastReceiver-廣播(三)發送及自定義廣播權限》
《BroadcastReceiver-廣播(四)五種類型》