感谢:http://www.devdiv.com/home.php?mod=space&uid=14682&do=blog&id=3776

在android中,通过广播(broadcast)可以通知其他广播接受者某个事件发生了。比如电源强度,信号强度等。
Broadcast机制是基于一种注册方式的,Broadcast Receiver将其特征描述并注册在系统中。根据注册时机,可以分为两类,网上有人称之为静态注册和动态注册。
静态注册,就是Broadcast Receiver的相关信息写在配置文件中,系统会负责在相关事件发生的时候及时通知到该Broadcast Receiver。这种模式适合于这样的场景:某事件发生
-> 通知Broadcast -> 启动相关处理应用。比如,监听来电、邮件、短信之类的,都隶
属于这种模式。 这个方式实现如下:
(1)接收广播
Public class MyBroadcastReceiver extends BroadcastReceiver { Public void onReceive(Context context, Intene intent){ // TODO}

(2)发送广播
 Intent it = new Intent(NEW_BROADCAST_FILTER); sendBroadcast(it);


(3)配置广播
在receiver的action中定义了该receiver能够接受的广播,Manifest.xml定义部分:
<receiver android:name=”.MyBroadcastReceiver”> <intent-filter><action android:name= NEW_BROADCAST_FILTER /></intent-filter></receiver>


动态注册,注册这样的事情都是由应用自己来处理的,通常是在OnResume事
件中通过registerReceiver进行注册,在OnPause等事件中通过unregisterReceiver取消注
册,通过这种方式使其能够在运行期间保持对相关事件的关注。比如,判断网络变化,有些应用会在运行期间关注网络状况变化的需求,使其可以在有网络的时候优先使用网络,在其他情况下,首先通过本地数据。而这样的监听,只需要在其工作状态下保持就好,不运行的时候,管你是天大的网路变化,与我何干。其模式可以归结为:启动应用 -> 监听事件 -> 发生时进行处理。 动态注册广播方式如下:
(1)声明一个BroadcastReceiver
BroadcastReceiver mReceiver=new BroadcastReceiver(){Public void onReceive(Context context,Intent intent){ //收到Broadcast会跑到这里         }}

(2) OnResume时,通过registerReceiver注册。
IntentFilter mfilter=new IntentFilter();mfilter.addAction(NEW_BROADCAST_FILTER);registerReceiver(mReceiver,mfilter);

(3)OnPause时,通过unregisterReceiver反注册。
unregisterReceiver(mReceiver);

android中发送广播有两种方式,Context.sendBroadcast和Context.sendOrderedBroadcast,前者发出的称为Normal broadcast,所有关注该消息的Receiver,都有机会获得并进行处理;后者放出的称作Ordered broadcasts,顾名思义,接受者需要按资排辈,排在后面的能否收到广播,需要看前面的处理方式,如果前面的Receiver阻止了这个消息继续广播,排在后面的就不会在接收到这个广播,短信广播就是Ordered broadcasts。
<receiver android:name=".SmsReceiver">       <intent-filter android:priority="1999">            <action android:name="android.provider.Telephony.SMS_RECEIVED"/>         </intent-filter></receiver>

Ordered broadcasts根据priority值确定优先级,值越大优先级越高,如果你的短信程序中priority最大,接收到短息广播后阻止了其继续广播,就达到了拦截短信的效果。
最后需要注意的是,当Broadcast Receiver接收到相关的消息,在OnReceive中不要执行很消耗时间(通常不大于5秒)的操作,通常把消耗时间的操作放到一个Service中,在OnReceive中启动该Service。

更多相关文章

  1. Android四大基本组件介绍与生命周期
  2. 第三章 Android程序设计基础
  3. android 创建桌面快捷方式 、插件
  4. android源码下载方式
  5. 创建android逐帧动画的两种方式
  6. 【安卓笔记】android客户端与服务端交互的三种方式
  7. android触摸实现物体运动方式
  8. TabHost两种实现方式
  9. Android(安卓)开机自启动程序

随机推荐

  1. Javascript构造函数有什么意义?
  2. 从javascript写入div
  3. 将数据从AJAX请求序列化到PHP
  4. iframe操作、调用父页面元素或js函数
  5. 如何让Require.js获取一个不以`.js`结尾
  6. 饿了么大前端 Node.js 进阶教程
  7. 如何使用显示滚动内容?
  8. 这种解决Fizzbuzz挑战的方式是什么?
  9. 子窗体传值给父窗体
  10. jquery ajax未捕获的SyntaxError:意外令