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

分類:IT技術 時間:2016-10-08

第4節 Broadcast的使用權限

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

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

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

4.1 限制接收者

假設組件A要發布廣播,

  1. 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>
  2. 在組件向整個系統發布廣播的時候,就采用,

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

    這裏的廣播權限

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

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

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

  2. 在它的

    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
要設置權限,只接收特定
發送者
發來的廣播,

  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" />
  2. 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要發送相應的廣播,就要

  1. 在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
    的權限值。

  2. 使用代碼發送廣播,

    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>
  1. android:exported
    屬性設置成
    true
    :可以接收其他應用發來的廣播;
  2. 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種廣播,

  1. Intent.ACTION_TIME_TICK
  2. Intent.ACTION_TIME_CHANGED
  3. 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:

文章來源:


ads
ads

相關文章
ads

相關文章

ad