Android中的四大组件之-Boradcast

Android引入广播机制的用意

  1. 从MVC的角度考虑
  2. 程序间互通消息(例如在自己的程序内中监听系统电话)
  3. 效率上(参考UDP的广播协议在局域网的方便性)
  4. 设计模式上(反转控件的一种应用,类你监听者模式)

广播发送的两种类型

普通广播:完全异步的,所有的广播接收者在同一时刻以未定义的顺序运行,消息传递的效率比较高。但缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播
顺序广播:所有广播接收者按顺序执行,其中一个执行广播接收者可以将结果传递给下一个广播接收者,也可以退出广播以便于不将结果传递到下一个广播接收者,可以在清单文件使用android:priority属性来确定广播接收者的优先级,数越大优先级别越高,取值范围:-1000到1000。也可以调用IntentFilter对象的setPriority()进行设置),被接收者依次接收广播,同一优先级的接收者可以随机顺序执行。
Context.sendBroadcast():发送的是普通广播,所有订阅者都有机会获得并进行处理。
Context.sendOrderedBroadcast():发送的是有序广播,系统会根据接收者声明的优先级别按顺序逐个执行接收者,前面的接收者有权终止广播(通过BroadcastReceiver.abortBroadcast()),如果广播被前面的接收者终止,后面的接收者就再也无法获取到广播。对于有序广播,前面的接收者可以将处理结果存放进广播Intent,然后传给下一个接收者。

广播发送

使用ContextWrapper类中的public void sendBroadcast(Intent intent)发送广播,例如:

 Intent intent=new Intent();
 intent.setAction("com.example.boradcastreceive.MainActivity");
 intent.putExtra("message", "你好");
 sendBroadcast(intent);

广播注册的两种方式

动态注册:非长驻性广播,生命周期可控制
Activity的子类中使用registerReceiver()方法注册,如下:

MyBoradcastReceive receiver=new MyBoradcastReceive();
IntentFilter filter=new IntentFilter("com.example.boradcastreceive.MainActivity");
registerReceiver(receiver, filter);

静态注册:长驻性广播,一旦应用程序被安装就能接收到广播,生命周期不可控制
在清单文件中标记中进行注册,例如:

<receiver android:name="com.example.orderboradcastrecevie1.MyBordcast">
        <intent-filter android:priority="1000">
             <action android:name="com.example.orderboradcastrecevie1.MainActivity"/>
         </intent-filter>
 </receiver>

广播接收器(BroadcastReceiver)

通过继承BroadcastReceiver抽象类实现广播接收器,在广播接收器中可以通过 abortBroadcast()终止广播,用setResultExtras()来发送数据。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章