Broadcast

来源:互联网 发布:数据库系统的简易设计 编辑:程序博客网 时间:2024/06/11 07:23
http://blog.csdn.net/jiangwei0910410003/article/details/19150705
http://blog.csdn.net/as02446418/article/details/46930005

一、广播(Broadcast):顾名思义,就是一处发出通知,多处得到通知后分别进行处理。和观察者模式有相似之处。一般Activity发送广播。
依据Broadcast的作用,可以将广播分为三种:
1,一般广播:完全异步的,可以在同一时刻(逻辑上)被所有广播接收者接收到,消息传递的效率比较高    Context.sendBroadcast()   
2,有序广播,所有receiver只能按照一定的优先级(声明在intent-filter元素的android:priority属性中,数越大优先级别越高,取值范围:-1000到1000。也可以调用IntentFilter对象的setPriority()进行设置)顺序,依次接收并且处理;不仅如此,前面的receiver不仅可以将额外的信息塞入广播还可以终止广播。   Context.sendOrderedBroadcast()
abortBroadcast();//终止此次广播的传输
   静态广播: AndroidManifest.xml, <intent-filter>android:priority属性
   动态广播: IntentFilter对象的setPriority()方法来设置优先级
  数值越大表示优先级越高,取值范围为-1000到1000.
3,粘性广播: 可以保证“在广播递送时尚未注册的receiver”,一旦日后注册进系统,就能够马上接到“错过”的sticky广播。这是一种很神奇的广播,我觉得关机时的来电(开机后,收到错过电话的通知)应该就是这种广播。静态广播大都是有序广播。
二、广播接收器:
第一步:定义广播接收器,继承BroadcastReceiver,并重写onReceive()方法。
    public class IncomingSMSReceiver extends BroadcastReceiver {  
      @Override public void onReceive(Contextcontext, Intentintent) {  
      }  
    }  
第二步:订阅感兴趣的广播Intent,订阅方法有两种:
1.使用代码进行订阅(动态订阅)当应用程序结束了,广播自然就没有了,比如你在activity中的onCreate或者onResume中订阅广播,同时你必须在onDestory或者onPause中取消广播订阅。不然会报异常。
//注册广播
IntentFilter filter = newIntentFilter("android.provider.Telephony.SMS_RECEIVED");  
IncomingSMSReceiver receiver = newIncomingSMSReceiver();  
registerReceiver(receiver, filter);
//取消广播  
unregisterReceiver(receiver);
2.在AndroidManifest.xml文件中的<application>节点里进行订阅(静态订阅):常驻型广播,当你的应用程序关闭了,如果有广播信息来,你写的广播接收器同样的能接受到。
    <receiver android:name=".IncomingSMSReceiver">  
       <intent-filter>  
            <action android:name="android.provider.Telephony.SMS_RECEIVED"/>  
       </intent-filter>  
    </receiver>  

<receiver android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permission="string"
android:process="string" >
. . .
</receiver>
android:exported ——此broadcastReceiver能否接收其他App的发出的广播,这个属性默认值有点意思,其默认值是由receiver中有无intent-filter决定的,如果有intent-filter,默认值为true,否则为false。(同样的,activity/service中的此属性默认值一样遵循此规则)同时,需要注意的是,这个值的设定是以application或者application user id为界的,而非进程为界(一个应用中可能含有多个进程);
android:name —— 此broadcastReceiver类名;
android:permission ——如果设置,具有相应权限的广播发送方发送的广播才能被此broadcastReceiver所接收;
android:process ——broadcastReceiver运行所处的进程。默认为app的进程。可以指定独立的进程(Android四大基本组件都可以通过此属性指定自己的独立进程)

1.广播接收者BroadcastReceiver通过Binder机制向AMS(Activity Manager Service)进行注册;
2.广播发送者通过binder机制向AMS发送广播;
3.AMS查找符合相应条件(IntentFilter/Permission等)的BroadcastReceiver,将广播发送到BroadcastReceiver(一般情况下是Activity)相应的消息循环队列中;
4.消息循环执行拿到此广播,回调BroadcastReceiver中的onReceive()方法。

广播发送者和广播接收者分别属于观察者模式中的消息发布和订阅两端,AMS属于中间的处理中心。广播发送者和广播接收者的执行是异步的,发出去的广播不会关心有无接收者接收,也不确定接收者到底是何时才能接收到。显然,整体流程与EventBus非常类似。

发送广播时,指定特定广播接收器所在的包名,具体是通过intent.setPackage(packageName)指定在,这样此广播将只会发送到此包中的App内与之相匹配的有效广播接收器中。

对于静态注册的ContextReceiver,回调onReceive(context, intent)中的context具体指的是ReceiverRestrictedContext;对于全局广播的动态注册的ContextReceiver,回调onReceive(context, intent)中的context具体指的是Activity Context;对于通过LocalBroadcastManager动态注册的ContextReceiver,回调onReceive(context, intent)中的context具体指的是Application Context。对于LocalBroadcastManager方式发送的应用内广播,只能通过LocalBroadcastManager动态注册的ContextReceiver才有可能接收到(静态注册或其他方式动态注册的ContextReceiver是接收不到的)。

封装好的LocalBroadcastManager类,用于统一处理App应用内的广播问题,使用方式上与通常的全局广播几乎相同,只是注册/取消注册广播接收器和发送广播时将主调context变成了LocalBroadcastManager的单一实例。
 //registerReceiver(mBroadcastReceiver, intentFilter);
  //注册应用内广播接收器
  localBroadcastManager = LocalBroadcastManager.getInstance(this);
  localBroadcastManager.registerReceiver(mBroadcastReceiver, intentFilter);

  //unregisterReceiver(mBroadcastReceiver);
  //取消注册应用内广播接收器
  localBroadcastManager.unregisterReceiver(mBroadcastReceiver);

 Intent intent = new Intent();
 intent.setAction(BROADCAST_ACTION);
 intent.putExtra("name", "qqyumidi");
 //sendBroadcast(intent);
 //发送应用内广播
 localBroadcastManager.sendBroadcast(intent);




































阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 宝宝发烧39.5度怎么办 小孩退烧有发烧怎么办 宝宝发烧38.7度怎么办 宝宝发烧38.8度怎么办 孕早期大便出血怎么办 孕初大便出血怎么办 大便肛门痔出血怎么办 上火拉大便出血怎么办 上火大便有血怎么办 鼻子淌血止不住怎么办 破鼻子止不住血怎么办 鼻子碰流血了怎么办 非经期下面流血怎么办 来例假流血不止怎么办 月经来了止不住怎么办 拉屎老拉到痛怎么办 婴儿拉绿色大便怎么办 痔疮拉屎疼出血怎么办 痔疮大便拉血怎么办 痔疮流血了怎么办呢 大便化验有霉菌怎么办 儿童大便有霉菌怎么办 小孩大便有霉菌怎么办 一个月宝宝肠炎怎么办 要验大便拉不出怎么办 白带检查有霉菌怎么办 孕妇有慢性肠炎怎么办 婴儿拉屎有血丝怎么办 新生儿大便有血怎么办 宝宝大便拉血怎么办 大便时拉出血怎么办 宝宝的鼻子流血怎么办 宝宝鸡蛋清过敏怎么办 两岁半宝宝肛裂怎么办 九个月宝宝贫血怎么办 宝宝肛门红肿怎么办呢 一岁宝宝便干要怎么办 宝宝大便干出血怎么办 宝宝拉大便出血怎么办 孩子肛裂出血怎么办 宝宝大便有血怎么办