Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 四大組件之BroadcastReceiver(二)-使用權限和常用的系統廣播

四大組件之BroadcastReceiver(二)-使用權限和常用的系統廣播

編輯:關於Android編程

第4節 Broadcast的使用權限

為廣播設置權限要考慮兩方面的問題。

作為廣播的發送者,希望限制廣播的接收者,只讓特定的應用組件接收到發出的廣播; 作為廣播的接收者,不希望任何組件都能模仿它關心的廣播,因此希望在接受廣播的時候能檢查一下這條廣播的發送者是否具有發送這條廣播的資格;

無論是上面哪種情況,解決方法都試一樣的:為發送者和接收者都設置一個相同的權限,只有它們的權限匹配上了,廣播機制才能產生效果。

4.1 限制接收者

假設組件A要發布廣播,

AndroidManifest.xml文件中,與同級的位置,對外聲明使用權限,表示這個應用發布了一個叫做com.anddle.receiver.receivebroadcast的權限,



    

    

在組件向整個系統發布廣播的時候,就采用,

//前一個參數是廣播的名稱,後一個參數是廣播權限的名稱
sendBroadcast("custom.action.mybroadcast","com.anddle.receiver.receivebroadcast");

這裡的廣播權限com.anddle.receiver.receivebroadcast,就是AndroidManifest.xml中聲明的權限。

接收者要接收這種廣播的時候,

接受者需要在它的AndroidManifest.xml當中靜態的定義好接收機對應的receiver,或者在代碼當中動態的定義好接收機對應的receiver

在它的AndroidManifest.xml當中,聲明要使用的權限,


    
    

    
        
        
           
               
               
           
        

    

4.2 限制發送者

假設接收者1要設置權限,只接收特定發送者發來的廣播,

AndroidManifest.xml文件中,對要設置權限的Broadcast Receiver設置上android:permission屬性,該屬性值可以任意指定一個字符串。通常使用程序的包名作為其中的一部分,這樣可以避免和其他應用中的權限聲明沖突。例如com.anddle.receiver.sendbroadcast

AndroidManifest.xml文件中,與同級的位置,對外聲明前面使用的標簽,表示這個應用發布了一個叫做com.anddle.receiveraccess的權限,



    

    

其中android:name屬性的值,就是標簽中設置的android:permission的值。

發送者B要發送相應的廣播,就要

在B的AndroidManifest.xml中加入權限的使用,



    

    

其中,標簽中設置的android:name的值,就是應用A中對外聲明的那個Broadcast Receiver的權限值。

使用代碼發送廣播,

Intent i = new Intent("custom.action.mybroadcast");
sendBroadcast(i);

4.3 接收其它應用的廣播

在應用的AndroidManifest.xml文件中,Broadcast Receiver具有android:exported屬性,

android:exported屬性設置成true:可以接收其他應用發來的廣播; android:exported屬性設置成false:不能接收其他應用發來的廣播;

所以當兩個不同的應用之間需要發送和接收廣播的時候,需要把這個屬性設置成true


/*******************************************************************/
* 版權聲明
* 本教程只在CSDN和安豆網發布,其他網站出現本教程均屬侵權。
/*******************************************************************/


第5節 系統的廣播

系統提供了很多現成的廣播,開發者可以根據自己應用的需要,關注某些特定的廣播。這裡介紹幾種使用頻率最高的廣播。

5.1 開機完成

有的時候,應用希望在開機完成之後,啟動一個在後台運行的Service。例如我們常用的微信應用,開機後會啟動一個Service和網絡相連,如果有消息來,就通知我們有朋友發消息來了。

但是系統剛啟動,用戶沒有主動打開微信,那麼這個微信的Service是不會運行起來的。這時候,就可以使用Broadcast Receiver了,讓它關注一個叫做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_TICKIntent.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())) {
         //時區發生變化 
       }
   }
};
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved