BroadcastReceiver 使用方式

来源:互联网 发布:淘宝发货后找不到店铺 编辑:程序博客网 时间:2024/06/06 20:03

BroadcastReceiver: 广播接收器,一个专门接收广播的组件,它需要在系统中进行注册,注册方式有静态注册(在manifest.xml中注册)和动态注册(在Activity或service中注册)两种, 注册的作用就是告诉系统,我只接收什么样的广播(具体通过action属性设置),如果有这样的广播,就发出请求,我来处理下。

静态注册:在manifest.xml中进行注册,表示只要是android.intent.action.mybroadcast_action这个地址的广播,MyBroadcastReceiverS1都能够接收的到。注意,这种方式的注册是常驻型的,也就是说当应用关闭后,如果有广播信息传来,MyBroadcastReceiverS1也会被系统调用而自动运行。

<!-- 在manifest。xml中注册广播接收者 -->

       <receiverandroid:name="com.androidstudydemo.broadcastReceiver.MyBroadcastReceiverS1">

           <intent-filter android:priority="1000" >

               <actionandroid:name="android.intent.action.mybroadcast_action" />

               <category android:name="android.intent.category.DEFAULT"/>

           </intent-filter>

       </receiver>

 

动态注册:在代码中动态的指定广播地址并注册,通常我们是在Activity或Service注册一个广播,这种注册方式与静态注册相反,不是常驻型的,也就是说广播会跟随程序的生命周期,当Activity或service销毁时,我们必须对Receiver解除注册,否则会报异常,因此我们要在特定的方法中对Receiver进行解除注册。

//在Activity中动态的注册广播接收器

battertChangeReceiver = newMyBroadcastReceiverD4();

                   IntentFilterfilter = new IntentFilter(

                                     "android.intent.action.MY_BROADCAST");

                   registerReceiver(battertChangeReceiver,filter);

        

//在Activity的destroy方法解除注册

@Override

protected void onDestroy() {

         super.onDestroy();

         unregisterReceiver(battertChangeReceiver);

}

 

如果有多个接收者都注册了相同的广播地址,又会是什么情况呢,能同时接收到同一条广播吗,相互之间会不会有干扰呢?这就涉及到普通广播和有序广播的概念了。

普通广播:对于多个接收者来说是完全异步的,通常每个接收者都无需等待即可以接收到广播,接收者相互之间不会有影响。对于这种广播,接收者无法终止广播,即无法阻止其他接收者的接收动作。

有序广播:有序广播比较特殊,它每次只发送到优先级较高的接收者那里,然后由优先级高的接受者再传播到优先级低的接收者那里,优先级高的接收者有能力终止这个广播。静态注册的有序广播要加上android:priority="1000"属性来定义优先级,动态的可以在代码中设置setPriority();发送有序广播调用方法sendOrderedBroadcast(Intent intent,String permission);

<!-- 在manifest。xml中注册广播接收者,有序广播需要指定priority属性,同时注意,一个接收器可以注册多种类型的广播,如下面定义的MyBroadcastReceiverS3-->

       <receiverandroid:name="com.androidstudydemo.broadcastReceiver.MyBroadcastReceiverS1">

           <intent-filter android:priority="1000" >

               <actionandroid:name="android.intent.action.mybroadcast_action" />

 

               <category android:name="android.intent.category.DEFAULT"/>

           </intent-filter>

       </receiver>

       <receiverandroid:name="com.androidstudydemo.broadcastReceiver.MyBroadcastReceiverS2">

           <intent-filter android:priority="999" >

               <actionandroid:name="android.intent.action.mybroadcast_action" />

 

               <category android:name="android.intent.category.DEFAULT"/>

           </intent-filter>

       </receiver>

                   <!--定义两个action,该Receiver可以接收多种类型的广播 -->

       <receiverandroid:name="com.androidstudydemo.broadcastReceiver.MyBroadcastReceiverS3">

            <intent-filterandroid:priority="998" >

               <actionandroid:name="android.intent.action.mybroadcast_action" />

                                     <actionandroid:name="android.net.conn.CONNECTIVITY_CHANGE"></action>

               <category android:name="android.intent.category.DEFAULT"/>

           </intent-filter>

       </receiver>

 

在发送的有序广播的前提下,在广播的Receiver方法里面调用setResultExtras(bundle),那么优先接收到Broadcast的接收者可以通过setResultExtras(Bundle)方法将处理结果存入Broadcast中,然后传给下一个接收者,非有序广播即使设置了也无效。

 

//如果是发送的有序广播,那么优先接收到Broadcast的接收者可以通过setResultExtras(Bundle)方法将处理结果存入Broadcast中,然后传给下一个接收者

                   Bundlebundle = new Bundle();

                   bundle.putString("msg",msg + "@MyBroadcastReceiverS2");

                   setResultExtras(bundle);

 

调用abortBroadcast()可以停止广播的传播,此方法只对有序广播有效,普通广播无效。高优先级的Receiver调用该方法之后,低优先级的Receiver将不会接收到广播。

使用sendOrderedBroadcast方法发送有序广播时,需要一个权限参数,如果为null则表示不要求接收者声明指定的权限,如果不为null,则表示接收者若要接收此广播,需声明指定权限。这样做是从安全角度考虑的,例如系统的短信就是有序广播的形式,一个应用可能是具有拦截垃圾短信的功能,当短信到来时它可以先接受到短信广播,必要时终止广播传递,这样的软件就必须声明接收短信的权限。

                            caseR.id.button2:// 有序广播

                            intent= new Intent("android.intent.action.mybroadcast_action");

                            intent.putExtra("type",2);

                            intent.putExtra("msg","发送有序广播 ");

                            //发送有序广播

                            sendOrderedBroadcast(intent,"scott.permission.mybroadcast_permission");

                            break;

 

所以我们在AndroidMainfest.xml中定义一个权限(关于权限定义,声明与使用,请参照:http://blog.csdn.net/liuhe688/article/details/6417983),然后使用该权限:

 

<!-- 自定义权限 -->

   <permission

       android:name="scott.permission.mybroadcast_permission"

       android:protectionLevel="normal" >

   </permission>

 

    <!--使用自定义的权限 -->

   <uses-permissionandroid:name="scott.permission.mybroadcast_permission" />

0 0
原创粉丝点击