Chinaunix首页 | 论坛 | 博客
  • 博客访问: 688163
  • 博文数量: 207
  • 博客积分: 1743
  • 博客等级: 上尉
  • 技术积分: 2044
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-20 14:36
文章分类

全部博文(207)

文章存档

2016年(24)

2015年(10)

2014年(50)

2013年(45)

2012年(78)

分类: Android平台

2016-03-29 10:33:19



简介

简单的说BroadcastReceiver就是针对消息的处理机制,比起handlermessage的消息处理机制来说,他的范围可以更广,不过在BroadcastReceiver是不能进行耗时的操作的,

可能超出十秒后程序就会报错了。


1.自定义一个广播处理者

//如果广播事件处理类是一个内部内的话,一定要声明为static的;如果还要注册为自定义广播那么要在主配置文件中receiver android:name声明格式为**.**.**.父类$当前类

[java] view plain copy
  1. public class MyCustomReceiver extends BroadcastReceiver{  
  2.   
  3. //处理广播  
  4.   
  5. @Override  
  6.   
  7. public void onReceive(Context context, Intent intent) {  
  8.   
  9. //接收广播进行处理  
  10.   
  11. String cmdAction=intent.getAction();//获取当前广播的action  
  12.   
  13. if("cn.android.app.current_weather".equals(cmdAction)){  
  14.   
  15. String getValue=intent.getStringExtra("weatherState");//获取当前广播的data ;  
  16.   
  17. System.out.println("广播接受成功,当前的传递的信息是:"+getValue);  
  18.   
  19.         }  
  20.   
  21.       }  
  22.   
  23.     }  

使用自己的广播,可以在主配置文件xml中使用receiver标签(注册处理广播的BroadcastReceiver类)和子标签intent-filter(需要action 属性来过滤广播,以便接受广播时能获取对应的那个广播)标签进行广播的静态注册,然后在代码中只需要发送广播就可以了,程序会自己去寻找主配置文件中所配置的对应广播的处理者;

在代码中发送自定义广播后,系统除了会自动调用对应(action一致)的在主配置文件中使用receiver标签注册广播的广播处理类,还会调用在发送广播之前,其他通过代码注册了广播的处理者 ;一般对于自定义广播的处理者,一般就一个,多是使用主配置文件静态注册广播处理者来处理广播.

(无论是在代码中还是在主配置文件中,我们都可以注册多个广播处理者以共同接受处理广播,不过无论在那个地方注册,同一广播处理者在所在注册区域,只能有效注册一次,重复不会报错,只是无效).

使用自定义一个广播处理者可以在主配置文件中进行静态注册,那么在发送广播之后,广播处理者就能接收到广播了,而且这种形式是伴随着整个应用的生命周期(如果这种方式处理的广播是系统广播的话,那么不管应用程序是否开启,该广播处理者都能进行对广播的处理),不像代码那样只会伴随着context(一般是指activityService)的生命周期;

广播处理者(receiver)注册+广播过滤器声明(intent-filter)  ,在主配置文件中使用标签需要使用它的子标签 不然毫无意义;

[html] view plain copy
  1.   
  2.   
  3.   
  4.   
  5.   <receiver android:name="MyCustomReceiver">  
  6.   
  7.         
  8.       <intent-filter>  
  9.   
  10.           <action android:name="cn.android.app.current_weather"/>  
  11.   
  12.       intent-filter>  
  13.   
  14.         
  15.   receiver>  

注意:

(1) , 其实对于自定义的广播的处理,也完全可以不在主配置文件中进行如上注册,只要我们在发送自定义广播之前,进行了广播处理者的注册(注册后要在生命周期结束时,卸载广播,不然会报错),那么在发送自定义广播后依然能够处理到广播。

(不过代码注册的对于自定义广播的处理和在主配置文件中的静态注册区别是不能伴随整个应用程序,只能是所在context(一般是指activityService)的生命周期;还有,自定义广播中的action可以随便定义,只要注册和发送广播时使用的是一致的,那么就能实现对广播事件的处理);

(2) , 在主配置文件中进行对广播事件处理者的静态注册,一般是两个原因 :

     1,不管在所在程序是否开启都要处理系统广播  ;

     2,免去了在代码需要事先注册的情况,在代码中只需发送广播就可以对广播的进行处理,且这种广播处理者的生命周期是伴随整个应用程序(自定义广播)或者整个系统(系统广播) ;

所以是否通过主配置文件注册广播处理者,还是根据需求来定.



2.发送广播

 

发送广播一般由两部分组成:1:action (指定为是那种广播);  2:data (指定广播的信息);其中第一个是成功发出广播所必须要的;

代码实例

类型和解说



[java] view plain copy
  1. // 1:实例化一个Intent对象  
  2.   
  3. Intent intent = new Intent();  
  4.   
  5. // 2:添加广播的action  
  6.   
  7. intent.setAction(Intent.ACTION_EDIT);  
  8.   
  9. // 3:调用sendBroadcast把广播发送出去  
  10.   
  11. sendBroadcast(intent);  

1)发送系统广播

如果在主配置文件中通过声明了一个广播处理类,且在标签里面引用了对应的系统广播的话

(对应下面发送广播的intent-filter action的是"android.intent.action.EDIT"),那么在系统广播发出之后(这里通过代码发送系统广播),系统就会自动发送广播给那个广播处理类;

[java] view plain copy
  1. // 1:实例化一个Intent对象  
  2.   
  3. Intent intent = new Intent();  
  4.   
  5. // 2:添加广播的action,action的值是自定义的;  
  6.   
  7. intent.setAction("cn.android.app.current_weather");  
  8.   
  9. //3.添加发送广播的data,以便处理者针对对应的广播处理,有数据可以使用;  
  10.   
  11. intent.putExtra("weatherState""哈哈");  
  12.   
  13. //4:调用sendBroadcast把广播发送出去  
  14.   
  15. sendBroadcast(intent);  

(2)发送自定义的广播


3.动态注册广播处理者


动态注册广播处理者,也就是通过代码注册广播处理者,它的生命周期伴随着context(一般是指activityService);

如果注册的广播处理者只需要在程序运行片段的时候去处理广播,不需要在主配置文件中进行静态注册的话,就如下,直接通过代码注册广播处理者;

代码实例

类型和解说

[java] view plain copy
  1. //创建Intent过滤器实例   
  2.   
  3. IntentFilter intentFilter=new IntentFilter();  
  4.   
  5. //给过滤器设置相应的action  
  6.   
  7. intentFilter.addAction(Intent.ACTION_MEDIA_MOUNTED);  
  8.   
  9. intentFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);  
  10.   
  11. intentFilter.addAction(Intent.ACTION_MEDIA_REMOVED);  
  12.   
  13. intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);  
  14.   
  15. intentFilter.addAction(Intent.ACTION_BOOT_COMPLETED);  
  16.   
  17. //intentFilter.addAction(Intent.action_Me)  
  18.   
  19. //注册挂载广播  
  20.   
  21. MReceiver mReceiver=new MReceiver();  
  22.   
  23. registerReceiver(mReceiver, intentFilter);  
  24.   
  25. //卸载广播  
  26.   
  27. unregisterReceiver(mReceiver);  

(1).注册接受系统广播的广播处理类;

[java] view plain copy
  1. // 创建Intent过滤器实例  
  2.   
  3. IntentFilter intentFilter = new IntentFilter();  
  4.   
  5. // 给过滤器设置相应的action  
  6.   
  7. intentFilter.addAction("cn.android.app.current_weather");  
  8.   
  9. //注册挂载广播  
  10.   
  11. MReceiver mReceiver=new MReceiver();  
  12.   
  13. registerReceiver(mReceiver, intentFilter);  
  14.   
  15. //卸载广播  
  16.   
  17. unregisterReceiver(mReceiver);  

(2).注册接受自己的广播的广播处理类;




4.静态注册广播处理者


静态注册也就是在主配置文件中进行的对于广播的处理者的注册,它的形式:需要通过receiver声明广播处理者,intent-filter action声明所要处理的广播。

如果一个广播处理者不管所归属的程序是否开启都要处理系统广播的话,那么需要在主配置文件里面进行注册,这种静态注册的主要是针对于系统广播的处理者,它的生命周期将会伴随整个系统。

注意:

若在主配置文件中静态注册的是自定义广播处理类,那么在代码中发送了自定义的广播后,系统会自动发送广播到注册广播时的广播处理者,这种对于自定义广播的处理者的静态注册,它的生命周期是整个应用程序。

BroadcastReceiver广播处理者静态注册

 

[html] view plain copy
  1.   
  2.   
  3.    <receiver android:name="MyCustomReceiver1">  
  4.   
  5.        <intent-filter>  
  6.            <action android:name="广播的action"/>  
  7.        intent-filter>  
  8.   
  9.    receiver>  

值的一提的是:

[html] view plain copy
  1.  
    阅读(2282) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~