BroadcastReceiver学习之路(01)之普通广播及广播简介

BroadcastReceiver是Android四大组件之一,它是一种全局的监听器,用户监听系统全局的广播消息。它可以非常方便的实现系统中不同组件之间的通讯。


BroadcastReceiver简介

BroadcastReceiver用于接收程序(包括用户开发的程序和系统内检的程序)所发出的Broadcast Intent,与应用程序启动Activity、Service相同的是,程序启动BroadcastReceiver也只需要两步。

1、创建需要启动的BroadcastReceiver的Intent
2、调用Context的sendBroadcast()或sendOrderedBroadcast()方法来启动制定的BroadcastReceiver。

注意:当应用程序发出一个Broadcast Intent之后,所有匹配该Intent的BroadcastReceiver都有可能被启动。

(之前我们学习的各种On***Listener 只是程序级别的监听器,这些监听器运行在指定程序所在的进程中,当程序退出时,On***Listener监听器也就随之关闭了,但是BroadcastReceiver属于系统级别的监听器,他拥有自己的进程,只要存在与之匹配的Intent被广播出来,BroadcastReceiver总会被激发。)



BroadcastReceiver注册广播地址

由于BroadcastReceiver本质上属于一个监听器,因此实现BroadcastReceiver的方法很简单,只要重写BroadcastReceiver的onReceive(Context context,Intent intent)方法即可。

静态注册

静态注册是在AndroidManifest.xml文件中配置的,我们就来为MyReceiver注册一个广播地址:

[html]  view plain  copy
  1. <receiver android:name=".MyReceiver">  
  2.             <intent-filter>  
  3.                 <action android:name="android.intent.action.MY_BROADCAST"/>  
  4.                 <category android:name="android.intent.category.DEFAULT" />  
  5.             </intent-filter>  
  6.         </receiver>  

配置了以上信息之后,只要是android.intent.action.MY_BROADCAST这个地址的广播,MyReceiver都能够接收的到。注意,这种方式的注册是常驻型的,也就是说当应用关闭后,如果有广播信息传来,MyReceiver也会被系统调用而自动运行。

动态注册

动态注册需要在代码中动态的指定广播地址并注册,通常我们是在Activity或Service注册一个广播,下面我们就来看一下注册的代码:

[java]  view plain  copy
  1. MyReceiver receiver = new MyReceiver();  
  2.           
  3. IntentFilter filter = new IntentFilter();  
  4. filter.addAction("android.intent.action.MY_BROADCAST");  
  5.           
  6. registerReceiver(receiver, filter);  
注意,registerReceiver是android.content.ContextWrapper类中的方法,Activity和Service都继承了ContextWrapper,所以可以直接调用。在实际应用中,我们在Activity或Service中注册了一个BroadcastReceiver,当这个Activity或Service被销毁时如果没有解除注册,系统会报一个异常,提示我们是否忘记解除注册了。所以,记得在特定的地方执行解除注册操作:

[java]  view plain  copy
  1. @Override  
  2. protected void onDestroy() {  
  3.     super.onDestroy();  
  4.     unregisterReceiver(receiver);  
  5. }  

执行这样行代码就可以解决问题了。注意,这种注册方式与静态注册相反,不是常驻型的,也就是说广播会跟随程序的生命周期。


需要特别注意:

1、每次系统Broad时间发生后,系统就会创建对应的BroadcastReceiver的实例,并自动触发onReceive()方法,onReceive()方法执行完后,BroadcastReceiver的实例就会被销毁。

2、  如果BroadcastReceiver的onReceiver()方法不能再10秒内执行完成,Android会认为该程序无响应。所以不要在BroadcastReceiver的onReceiver()方法中执行一些耗时的操作,否则会弹出ANR的对话框。


3、如果确实需要根据Broadcast来完成一项比较耗时的操作,则可以考虑通过Intent启动一个Service来完成操作,可能出现的情况是子线程可能还没结束,BroadcastReceiver就退出了。就会导致BroadcastReceiver启动的子线程不能执行完成。


下面写一个简单的普通广播的例子:

布局:





MyReceiver类


MainActivity类


其实很容易理解,不过还是放一下dome,这样希望帮助更白的小白。

小dome地址:http://download.csdn.net/detail/bobo8945510/9623309






















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值