BroadcastReceiver中使用自定義Permission

   BroadcastReceiver中使用自定義Permission

 

       對於權限的使用,我想進行過android開發的都用過,比如:我們需要進行與網絡相關的操作時,就必須在manifest中聲明android.permission.INTERNET的權限;又或者我們需要對SDCard進行操作時,就需要聲明如下的權限:android.permission.WRITE_EXTERNAL_STORAGE(寫入數據的權限)和 

       android.permission.MOUNT_UNMOUNT_FILESYSTEMS(創建和刪除文件的權限)。

 

       如果創建自定義的permission,其實也是一件很簡單的事情;但是再創建自定義的permission之後,需要在廣播接收器BroadcastReceiver中使用,就必須注意如下的問題:

        ①、發送具有權限的廣播

        ②、具有權限的廣播接收器

        接下來我們就通過一個例子,來說明如何在BroadcastReceiver中使用自定義的permission,首先需要創建一個應用SelfPermissionBroadcastReceiver,下面1-2-3的操作都在該應用中。

        1、需要創建自定義的permission。在manifest中創建自定義permission的配置如下:     

    <!-- 創建自定義授權 -->
    <permission android:name="com.android.study.permission.MYRECEIVER"
                android:protectionLevel="dangerous">
    </permission>

             自定義permission中的name必須是唯一的,而protectionLevel則可以自己選擇。

        2、聲明自定義的permission只有在有用到該權限的時候才需要聲明,在manifest中聲明自定義permission的配置如下:            

    <!-- 聲明自定義權限 -->
    <uses-permission android:name="com.android.study.permission.MYRECEIVER"/>

             3、創建廣播接收類,一個具有自定義的權限,另一個則任何權限都沒有。其實接收處理的代碼大體一樣,只是在manifest或在代碼中registerReceiver進行註冊時,一個授予了權限,另一個則沒有授予。兩個類的核心代碼以及註冊(這裏採用的是manifest中靜態註冊)配置如下:

        ①、具有權限的廣播接收類PermissionBroadcastReceiver

        代碼:

	@Override
	public void onReceive(Context context, Intent intent) {
		//TO DO
		
		System.out.println("具有自定義權限的廣播接收類——" + intent.getStringExtra("data"));		
		//TO DO
	}

              配置文件註冊:

       <!-- 在receiver中使用自定義權限 -->
        <receiver android:name="com.android.study.receiver.PermissionBroadcastReceiver"
            android:permission="com.android.study.permission.MYRECEIVER">
        	
            <intent-filter>
                <action android:name="com.android.study.action.IRECEIVER" />
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </receiver>


        ②、沒有權限的廣播接收類NoPermissionBroadcastReceiver

        代碼:

	@Override
	public void onReceive(Context context, Intent intent) {
		//TO DO
		
		System.out.println("沒有自定義權限的廣播接收類——" + intent.getStringExtra("data"));
		
		//TO DO
	}

              配置文件註冊:

       <!-- 在receiver中不使用自定義權限 -->
        <receiver android:name="com.android.study.receiver.NoPermissionBroadcastReceiver">        	
            <intent-filter>
                <action android:name="com.android.study.action.IRECEIVER" />
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </receiver>

              4、另外創建一個應用SendBroadcast,並通過SendBroadcastActivity類進行廣播的發送,其主要代碼如下。 

      public void onCreate(Bundle savedInstanceState) {
        		super.onCreate(savedInstanceState);
        		setContentView(R.layout.main);
        
        		System.out.println("SendBroadcastActivity start....");
		Intent intent = new Intent();
		intent.setAction("com.android.study.action.IRECEIVER");
		intent.putExtra("data", "sendPermission");
		//發送帶權限的廣播
		System.out.println("SendBroadcastActivity send broadcast....");
		sendBroadcast(intent, "com.android.study.permission.MYRECEIVER");
		//發送一般的廣播
		intent = new Intent();
		intent.setAction("com.android.study.action.IRECEIVER");
		intent.putExtra("data", "sendNormal");
		sendBroadcast(intent);
		
		System.out.println("SendBroadcastActivity end....");
    }

      並在該SendBroadcast應用中聲明自定義的permission,其權限聲明如下:

    <!-- 聲明自定義權限 -->
    <uses-permission android:name="com.android.study.permission.MYRECEIVER"/>

      

       5、通過1-2-3-4的這些操作創建好了一個具有自定義permission的廣播發送接收實例,下面通過四種情況進行代碼的執行,通過LogCat的日誌記錄來分析具有自定義permission的廣播發送接收機制:

       ①、應用SendBroadcast和應用SelfPermissionBroadcastReceiver中的自定義權限聲明都打開(不註釋),通過運行SelfPermissionBroadcastReceiver之後再運行SendBroadcast,LogCat將打印如下的結果:

12-24 08:53:57.994: I/System.out(1833): SendBroadcastActivity Permission start....
12-24 08:53:57.994: I/System.out(1833): SendBroadcastActivity Permission send....
12-24 08:53:58.104: I/System.out(1833): SendBroadcastActivity Permission end....
12-24 08:53:58.244: I/System.out(1883): 具有自定義權限的廣播接收類——sendPermission
12-24 08:53:58.263: I/System.out(1883): 沒有自定義權限的廣播接收類——sendPermission
12-24 08:53:58.303: I/System.out(1883): 具有自定義權限的廣播接收類——sendNormal
12-24 08:53:58.334: I/System.out(1883): 沒有自定義權限的廣播接收類——sendNormal

       ②、應用SendBroadcast中的自定義權限聲明打開,而應用SelfPermissionBroadcastReceiver中的自定義權限聲明註釋掉,通過運行SelfPermissionBroadcastReceiver之後再運行SendBroadcast,LogCat將打印如下的結果:

12-24 08:53:57.994: I/System.out(1833): SendBroadcastActivity Permission start....
12-24 08:53:57.994: I/System.out(1833): SendBroadcastActivity Permission send....
12-24 08:53:58.104: I/System.out(1833): SendBroadcastActivity Permission end....
12-24 08:53:58.303: I/System.out(1883): 具有自定義權限的廣播接收類——sendNormal
12-24 08:53:58.334: I/System.out(1883): 沒有自定義權限的廣播接收類——sendNormal

       ③、應用SendBroadcast中的自定義權限聲明註釋掉,而應用SelfPermissionBroadcastReceiver中的自定義權限聲明打開,通過運行SelfPermissionBroadcastReceiver之後再運行SendBroadcast,LogCat將打印如下的結果:

12-24 08:53:57.994: I/System.out(1833): SendBroadcastActivity Permission start....
12-24 08:53:57.994: I/System.out(1833): SendBroadcastActivity Permission send....
12-24 08:53:58.104: I/System.out(1833): SendBroadcastActivity Permission end....
12-24 08:53:58.244: I/System.out(1883): 沒有自定義權限的廣播接收類——sendPermission
12-24 08:53:58.263: I/System.out(1883): 沒有自定義權限的廣播接收類——sendNormal      

       ④、應用SendBroadcast和應用SelfPermissionBroadcastReceiver中的自定義權限聲明都註釋掉,通過運行SelfPermissionBroadcastReceiver之後再運行SendBroadcast,LogCat將打印如下的結果:

12-24 08:53:57.994: I/System.out(1833): SendBroadcastActivity Permission start....
12-24 08:53:57.994: I/System.out(1833): SendBroadcastActivity Permission send....
12-24 08:53:58.104: I/System.out(1833): SendBroadcastActivity Permission end....
12-24 08:53:58.334: I/System.out(1883): 沒有自定義權限的廣播接收類——sendNormal


       根據上述的四種情況以及各自打印的日誌,可以總結出具有permission(自定義或系統定義)的廣播發送接收機制:

        ①、當應用B(相當去例子中的應用SendBroadcast)發送帶權限的廣播時,如果應用A(相當去例子中的應用SelfPermissionBroadcastReceiver)需要接收該廣播,就必須在其manifest文件中聲明接收該廣播的權限,否則不能接收到該廣播信息。

        ②、當應用A(相當去例子中的應用SelfPermissionBroadcastReceiver)定義了帶權限的廣播接收器,如果應用B(相當去例子中的應用SendBroadcast)需要讓該廣播接收器接收處理髮送的廣播,就必須在其manifest文件中聲明訪問該廣播接收器的權限,否則不能被該廣播接收器接收處理。


       其實說的通俗一點就是:如果發送方設置了權限,接收方想要介紹該信息就必須聲明接收的權限;相反的,如果接收方設置了權限,發送方想要接收方進行接收處理,就必須聲明被處理的權限。




 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章