首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

BroadcastReceiver中运用自定义Permission

2013-01-04 
BroadcastReceiver中使用自定义PermissionBroadcastReceiver中使用自定义Permission对于权限的使用,我想进

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

        代码:

@Overridepublic void onReceive(Context context, Intent intent) {//TO DOSystem.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

        代码:

@Overridepublic void onReceive(Context context, Intent intent) {//TO DOSystem.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): 具有自定义权限的广播接收类——sendPermission12-24 08:53:58.263: I/System.out(1883): 没有自定义权限的广播接收类——sendPermission12-24 08:53:58.303: I/System.out(1883): 具有自定义权限的广播接收类——sendNormal12-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): 具有自定义权限的广播接收类——sendNormal12-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): 没有自定义权限的广播接收类——sendPermission12-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文件中声明访问该广播接收器的权限,否则不能被该广播接收器接收处理。


       其实说的通俗一点就是:如果发送方设置了权限,接收方想要介绍该信息就必须声明接收的权限;相反的,如果接收方设置了权限,发送方想要接收方进行接收处理,就必须声明被处理的权限。




 

 

热点排行