广播——BroadcastReceiver的有序广播和优先级
2016-07-22 10:19
393 查看
转自http://www.cnblogs.com/codingblock/p/4856559.html
一、两种Broadcast:
· 普通广播(Normal Broadcast):用sendBroadcast()方法发送。
普通广播是完全异步的,逻辑上可以在同一时刻被所有匹配的接受者接收到,消息传递效率高,缺点是接受者不能将处理结果传递给下一个接收者,也无法终止广播传播。
· 有序广播(Ordered Broadcast):用sendOrderedBroadcast()方法发送。
有序广播的接收者们将按照事先生命的优先级依次接收,数越大优先级越高(取值范围:-1000~10000),优先级可以声明在<intent-filter android:priority="n".../>,也可以调用IntentFilter对象的setPriority设置。并且接收者可以终止传播(调用abortBroadcast()方法即可终止),一旦终止后面接收者就无法接受广播。另外,接受者可以将处理结果存入数据(可通过setResultExtras(Bundle)方法将数据存入Broadcast),当做Broadcast再传递给下一级接收者(可通过代码Bundle
bundle = getResultExtras(true)获取上一级传递过来的数据)。
短信拦截原理:系统收到短信,发出的Broadcast属于有序广播,程序就可以通过设定优先级先接收到通知,然后终止传递。
二、举个例子(有序广播):
1、首先创建两个BroadcastReceiver。让第一个receive接收到广播后中断。
MyReceiver.java
MyReceiver1.java
2、然后将两个receiver的action在AndroidManifest.xml文件中配置成一样的,并且设置成不同的优先级,代码如下:
3.最后在MainActivity中发送广播
一、两种Broadcast:
· 普通广播(Normal Broadcast):用sendBroadcast()方法发送。
普通广播是完全异步的,逻辑上可以在同一时刻被所有匹配的接受者接收到,消息传递效率高,缺点是接受者不能将处理结果传递给下一个接收者,也无法终止广播传播。
· 有序广播(Ordered Broadcast):用sendOrderedBroadcast()方法发送。
有序广播的接收者们将按照事先生命的优先级依次接收,数越大优先级越高(取值范围:-1000~10000),优先级可以声明在<intent-filter android:priority="n".../>,也可以调用IntentFilter对象的setPriority设置。并且接收者可以终止传播(调用abortBroadcast()方法即可终止),一旦终止后面接收者就无法接受广播。另外,接受者可以将处理结果存入数据(可通过setResultExtras(Bundle)方法将数据存入Broadcast),当做Broadcast再传递给下一级接收者(可通过代码Bundle
bundle = getResultExtras(true)获取上一级传递过来的数据)。
短信拦截原理:系统收到短信,发出的Broadcast属于有序广播,程序就可以通过设定优先级先接收到通知,然后终止传递。
二、举个例子(有序广播):
1、首先创建两个BroadcastReceiver。让第一个receive接收到广播后中断。
MyReceiver.java
public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { System.out.println("MyReceiver接受到消息"); abortBroadcast(); //中断广播,不会再响比它有优先级低得广播再传播下去了 } }
MyReceiver1.java
public class MyReceiver1 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { System.out.println("MyReceiver1接受到消息"); }
2、然后将两个receiver的action在AndroidManifest.xml文件中配置成一样的,并且设置成不同的优先级,代码如下:
<receiver android:name=".MyReceiver"> <!-- priority优先级:数字越高优先级越高 --> <intent-filter android:priority="5" > <action android:name="com.codingblock.myreceiver.intent.action.MyReceiver"/> </intent-filter> </receiver> <receiver android:name=".MyReceiver1"> <intent-filter android:priority="4"> <action android:name="com.codingblock.myreceiver.intent.action.MyReceiver"/> </intent-filter> </receiver>
3.最后在MainActivity中发送广播
public class MainActivity extends Activity { Button btn_send_receiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn_send_receiver = (Button)findViewById(R.id.btn_send_receiver); btn_send_receiver.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setAction("com.codingblock.myreceiver.intent.action.MyReceiver"); sendOrderedBroadcast(intent, null);//有序广播需要用sendOrderedBroadcast()方法发送 } }); } }
相关文章推荐
- 利用IE收听“广播”
- Android广播接收机制详细介绍(附短信接收实现)
- Jquery实现仿腾讯微博发表广播
- Android使用广播(BroadCast)实现强制下线的方法
- Android基于广播事件机制实现简单定时提醒功能代码
- Android实现静态广播监听器的方法
- Android中的广播、服务、数据库、通知、包等术语的原理和介绍(图解)
- Android中的广播(BroadCast)详细介绍
- Android中的广播和广播接收器代码实例
- Android基础知识之broadcast广播详解
- Android开发之广播机制浅析
- Android 广播大全 Intent Action 事件详解
- 广播
- 网络广播风暴的几种原因
- 【原理总结】DHCP数据包分析
- 广播 BroadCastReceiver
- Envivio发布4Caster™ 广播3500实况H.264编码器
- BroadcastReceiver应用详解
- 关于小米手机程序被kill掉都接收不到广播的问题
- Android广播机制分析