BroadcastReceiver與自定義許可權

2021-06-27 19:04:49 字數 3203 閱讀 6451

在清單檔案中通過進行宣告,然後通過引用自己宣告的許可權(可不引用)。示例:

在自定義許可權時,通常會指定protectionlevel屬性,常用的如下:

normal:預設的,應用安裝前,使用者可以看到相應的許可權,但無需使用者主動授權。

dangerous:normal安全級別控制以外的任何危險操作。需要dangerous級別許可權時,android會明確要求使用者進行授權。常見的如:網路使用許可權,相機使用許可權及聯絡人資訊使用許可權等。

signature:它要求許可權宣告應用和許可權使用應用使用相同的keystore進行簽名。如果使用同一keystore,則該許可權由系統授予,否則系統會拒絕。並且許可權授予時,不會通知使用者。它常用於應用內部。例如:

上面把protectionlevel宣告為signature。如果別的應用使用的不是同乙個簽名檔案,就沒辦法使用該許可權,從而保護了自己的接收者。

對於廣播接收者來說,別的應用也可以監聽並觸發我們的廣播接收者。如果廣播接收者註冊在清單檔案中,只需要在中配置android:exported="false"屬性。這樣,系統中的其它應用就無法觸及到該receiver了。

但如果receiver是動態註冊的,就需要建立自己的使用許可權,並且將protectionlevel設定為signature。這樣,當別的應用和receiver所在的應用使用的簽名不一樣時,便不會啟動該receiver。例如:

註冊廣播接收者

broadcastreceiver receiver = new otheractivity();

intentfilter filter = new intentfilter("action1");

filter.addcategory(intent.category_default);

//註冊receiver時,直接指定傳送者應該具有的許可權。不然外部應用依舊可以觸及到receiver

registerreceiver(receiver, filter, permission, null);

在註冊的時候,最關鍵的一點是用registerreceiver(broadcastreceiver, intentfilter, string, handler)進行註冊,而不是平常用的是registerreceiver(broadcastreceiver, intentfilter)。相較於後者,前者在註冊的時候要求了傳送者必須具有的許可權。如果傳送者沒有該許可權,那麼傳送者傳送的廣播即使經過intentfilter的過濾,也不會被receiver接收。此時如果再自定義乙個許可權,並且將許可權的protectionlevel設定為signature,那麼外部應用便無法使用該許可權,也就無法觸及到該receiver。上面的permission便是這樣的乙個許可權,宣告如下:

傳送廣播的**如下:
intent intent = new intent("action1");

intent.putextra("text", "receiver");

intent.addcategory(intent.category_default);

// 也可以使用sendbroadcast(intent);進行傳送

sendbroadcast(intent, permission);

通過sendbroadcast傳送的廣播都是無序廣播,所有receiver的接收順序和執行順序都是無法確定,它們什麼時候能執行完畢也是無法確定,同時也無法在receiver之間進行通訊。從而也無法使用getresultcode(),setresult()及abortbroadcast()一系列的方法。

通過sendorderedbroadcast()傳送的廣播便是有序廣播。

有序廣播有如下特點: 1,

所有的receiver依次執行

。按優先順序高低進行排序,優先順序高的receiver先執行,

直到最後

。但優先順序相同的receiver執行順序不確定。

2,高優先順序的receiver

可以使用setresult()等方法向其後的receiver傳遞資料。

3,低優先順序的receiver可以通過getresult()等方法來獲取高優先順序receiver通過setresult()等方法傳遞的資料。

4,所有的receiver都可以呼叫abortbroadcast()等方法中止廣播,使廣播不再往比它優先順序低的receiver上傳遞。 

5,優先順序的註冊方法有兩種,在清單檔案中

可以通過為intent-filter中新增android:priority屬性。在**中,可以通過

intentfilter.setpriority()進行設定。

優先順序最低是-999

。利用有序廣播的上述特點,可以實現一些功能。比如當介面顯示時不執行某個操作,而當介面不顯示時執行某個操作。

具體思路:將執行操作放在乙個低優先順序的receiver中,同時在介面中註冊乙個高優先順序的receiver,並且兩個receiver的intent一樣。當介面接收到廣播時,直接取消廣播或者通知低優先的廣播不執行操作。這裡最主要的就是介面中的廣播接收者要放在哪個方法中進行註冊,一般是放在onstart()和onstop()中的。因為這兩個方法確定了介面可見的邊界

註冊和取消註冊的**略,只是在註冊時要通過intentfilter.setpriority()方法設定介面receiver的優先順序,一般設定成1000。具體的接收者如下:

private class interceptreceiver extends broadcastreceiver 

}

執行操作的receiver一般要根據resultcode的值判斷是否應該進行某種操作。如下:

public void onreceive(context context, intent intent)  else 

}

傳送廣播也沒什麼問題,只是在傳送的時候將resultcode的值初始值設定為activity.result_ok,這主要是為了和執行操作的receiver相對應。如:

// 設定resultcode的初始值為result_ok

sendorderedbroadcast(intent, null, null, null,

activity.result_ok, null, null);

使用MvcHandler設計自定義系統許可權《下》

本文是續上篇 使用mvchandler設計自定義系統許可權 上 的下篇。通過本篇,我將在mvc2.0中提出乙個系統許可權的解決方案,如存在不足的地方,希望您能夠指出。謝謝!一 回顧上篇 中的內容 重點回顧一下上篇的3.2中的myhandler類,該類繼承mvc2.0的mvchandler類。如下 貼...

c Attribute與自定義

using system using system.reflection public class demo public class myfieldattributes static void displayfield object obj,fieldinfo f attributes f.nam...

TensorFlow2 0 自定義層與自定義網路

自定義層函式需要繼承layers.layer,自定義網路需要繼承keras.model。其內部需要定義兩個函式 1 init 初始化函式,內部需要定義構造形式 2 call函式,內部需要定義計算形式及返回值。self def layer class mydense layers.layer inhe...