BroadcastReceiver-廣播(三)發送及自定義廣播權限

一、廣播的發送

經常說”發送廣播“和”接收“,表面上看廣播作為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:默認的,應用安裝前,用戶可以看到相應的權限,但無需用戶主動授權。
  • dangerousnormal安全級別控制以外的任何危險操作。需要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-廣播(四)五種類型》

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。