第4節 Broadcast的使用權限
為廣播設置權限要考慮兩方面的問題。
- 作為廣播的發送者,希望限制廣播的接收者,只讓特定的應用組件接收到發出的廣播;
- 作為廣播的接收者,不希望任何組件都能模仿它關心的廣播,因此希望在接受廣播的時候能檢查一下這條廣播的發送者是否具有發送這條廣播的資格;
無論是上面哪種情況,解決方法都試一樣的:為發送者和接收者都設置一個相同的權限,只有它們的權限匹配上了,廣播機制才能產生效果。
4.1 限制接收者
假設組件A要發布廣播,
在
androidManifest.xml
文件中,與同級的位置,對外聲明使用權限,表示這個應用發布了一個叫做com.anddle.receiver.receivebroadcast
的權限,<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <permission android:name="com.anddle.receiver.receivebroadcast" android:label="receiver pomission" android:protectionLevel="normal" /> <application ....../> </manifest>
在組件向整個系統發布廣播的時候,就采用,
//前一個參數是廣播的名稱,後一個參數是廣播權限的名稱 sendBroadcast("custom.action.mybroadcast","com.anddle.receiver.receivebroadcast");
這裏的廣播權限
com.anddle.receiver.receivebroadcast
,就是AndroidManifest.xml
中聲明的權限。
當
接收者要接收這種廣播的時候,
接受者
需要在它的AndroidManifest.xml
當中靜態的定義好接收機
對應的receiver
,或者在代碼當中動態的定義好接收機
對應的receiver
;在它的
AndroidManifest.xml
當中,聲明要使用的權限,<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <!--聲明要使用的權限--> <users-permission android:name = "com.anddle.receiver.receivebroadcast"/> <application ......> <!--假設采用的是靜態定義的接收機--> <receiver android:name=".MyReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="custom.action.mybroadcast"/> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver> </application> </manifest>
4.2 限制發送者
假設
接收者1要設置權限,只接收特定
發送者發來的廣播,
在
AndroidManifest.xml
文件中,對要設置權限的Broadcast Receiver
設置上android:permission
屬性,該屬性值可以任意指定一個字符串。通常使用程序的包名作為其中的一部分,這樣可以避免和其他應用中的權限聲明沖突。例如com.anddle.receiver.sendbroadcast
,<receiver android:name=".MyReceiver" android:enabled="true" android:exported="true" android:permission="com.anddle.receiver.sendbroadcast" />
在
AndroidManifest.xml
文件中,與同級的位置,對外聲明前面使用的標簽,表示這個應用發布了一個叫做com.anddle.receiveraccess
的權限,<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <permission android:name="com.anddle.receiver.sendbroadcast" android:label="receiver pomission" android:protectionLevel="normal" /> <application ....../> </manifest>
其中
android:name
屬性的值,就是<receiver/>
標簽中設置的android:permission
的值。
發送者B要發送相應的廣播,就要
在B的
AndroidManifest.xml
中加入權限的使用,<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.anddle.calculator"> <uses-permission android:name="com.anddle.receiver.sendbroadcast"/> <application ....../> </manifest>
其中,
<uses-permission/>
標簽中設置的android:name
的值,就是應用A中對外聲明的那個Broadcast Receiver
的權限值。使用代碼發送廣播,
Intent i = new Intent("custom.action.mybroadcast"); sendBroadcast(i);
4.3 接收其它應用的廣播
在應用的
AndroidManifest.xml文件中,
Broadcast Receiver具有
android:exported屬性,
<receiver android:name=".MyReceiver" android:enabled="true" android:exported="true"></receiver>
android:exported
屬性設置成true
:可以接收其他應用發來的廣播;android:exported
屬性設置成false
:不能接收其他應用發來的廣播;
所以當兩個不同的應用之間需要發送和接收廣播的時候,需要把這個屬性設置成
true。
/*******************************************************************/
* 版權聲明
* 本教程只在CSDN和安豆網發布,其他網站出現本教程均屬侵權。
/*******************************************************************/
第5節 系統的廣播
系統提供了很多現成的廣播,開發者可以根據自己應用的需要,關註某些特定的廣播。這裏介紹幾種使用頻率最高的廣播。
5.1 開機完成
有的時候,應用希望在開機完成之後,啟動一個在後臺運行的
Service。例如我們常用的微信應用,開機後會啟動一個
Service和網絡相連,如果有消息來,就通知我們有朋友發消息來了。
但是系統剛啟動,用戶沒有主動打開微信,那麽這個微信的
Service是不會運行起來的。這時候,就可以使用
Broadcast Receiver了,讓它關註一個叫做
android.intent.action.BOOT_COMPLETED的廣播,
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true"
android:permission="android.intent.action.BOOT_COMPLETED" />
這樣,等開機完成後,系統發出
android.intent.action.BOOT_COMPLETED廣播後,
MyReceiver就可以收到這條廣播,進行自己的處理-例如運行一個
Service了。
使用這條廣播有個很重要的地方需要註意,在Android 4.0以上的系統當中,安裝了這個應用以後,用戶必須手動啟動一次該應用(運行該應用的Activity),這樣重啟設備之後,就能收到
android.intent.action.BOOT_COMPLETED廣播了。
5.2 時間變化
如果我們很關心時間的變化,例如要實現一個時鐘,每一秒的變化,時間設置改變,時區變化都將是關心的內容。
所以,可以創建動態的
接收機監聽3種廣播,
Intent.ACTION_TIME_TICK
;Intent.ACTION_TIME_CHANGED
Intent.ACTION_TIMEZONE_CHANGED
final IntentFilter filter = new IntentFilter(); //監聽每一秒的變化 filter.addAction(Intent.ACTION_TIME_TICK); //監聽時間設置的改變 filter.addAction(Intent.ACTION_TIME_CHANGED); //監聽時區的改變 filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); registerReceiver(receiver, filter);
同時將
接收機定義成,
private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_TIME_TICK.equals(intent.getAction())) { //每一秒發生變化 } else if (Intent.ACTION_TIME_CHANGED.equals(intent.getAction())) { //時間發生變化 } else if (Intent.ACTION_TIMEZONE_CHANGED.equals(intent.getAction())) { //時區發生變化 } } };
Tags:
文章來源: