一.两种广播类型
2.1 标准广播
是一种完全异步执行的广播,在广播发出去之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可言。这种广播的效率会比较高,但同时也意味着它是无法截断的。
2.2 有序广播
是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递,所有此时的广播接收器是有先后顺序的,优先级高的广播接收器就可以先收到广播消息了,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了。
二.示例代码
2.1、发送标准广播
新建一个MyBroadcastReceiver继承自BroadcastReceiver,代码如下所示:
package com.nyl.custombroadcast; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast; public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context,"收到广播接收器",Toast.LENGTH_SHORT).show(); } }
然后AndroidManifest.xml中注册下,写上Intent-filter:
定义一个简单的按钮,用于作为发送广播的触发点,然后在MainActivity中完成发送按钮,代码如下所示:
package com.nyl.custombroadcast; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; public class MainActivity extends Activity implements View.OnClickListener { private Button btnSendBroadcast; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnSendBroadcast = (Button) findViewById(R.id.btnSendBroadcast); btnSendBroadcast.setOnClickListener(this); } @Override public void onClick(View view) { /** * 构建出一个Intent对象,并把要发送的广播的值传入,然后调用了Context的sendBroadcast()方法将广播发送出去 * 这样所有监听com.nyl.custombroadcast.MyBroadcastReceiver这条广播的广播接收器就会收到消息。 */ Intent intent = new Intent("com.nyl.custombroadcast.MyBroadcastReceiver"); sendBroadcast(intent); } }
运行程序,点击一下发送广播按钮,效果如下图:
这样我们就成功完成了发送自定义广播的功能了。
2.2、发送有序广播
接收者通过Bundle bundle = new getResultExtras(true)可以获取上一个接收者存入的数据,定义了两个AnotherBroadcastReceiver类,如下所示:
package com.nyl.orderlybroadcast; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.widget.Toast; public class AnotherBroadcastReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context,"收到广播接收器",Toast.LENGTH_SHORT).show(); //创建一个Bundle对象,并存入数据 Bundle bundle = new Bundle(); bundle.putString("first","有序广播"); //将bundle放入结果中 setResultExtras(bundle); //取消Broadcast的继续发送,也就是将广播截断,不再发给下一个广播接收器 abortBroadcast(); } }
package com.nyl.orderlybroadcast; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.widget.Toast; public class AnotherBroadcastReceiver1 extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { Bundle bundle = getResultExtras(true); //解析前一个BroadcastReceiver所存入的key为first的消息 String first = bundle.getString("first"); Toast.makeText(context,"第一个广播存入的消息为:" + first,Toast.LENGTH_SHORT).show(); } }
在AndroidManifest.xml中对该AnotherBroadcastReceiver进行注册,添加开机广播的intent-filter,然后android:priority属性给广播接收器设置了优先级,优先级比较高的广播接收器就可以先收到广播。如下图所示:
还是跟发送标准的一样,定义一个简单的按钮,用于作为发送广播的触发点,然后在MainActivity中完成发送按钮,代码如下所示:
package com.nyl.orderlybroadcast; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; public class MainActivity extends Activity implements View.OnClickListener { private Button btnOrderlyBroadcast; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnOrderlyBroadcast = (Button) findViewById(R.id.btnOrderlyBroadcast); btnOrderlyBroadcast.setOnClickListener(this); } @Override public void onClick(View view) { Intent intent = new Intent("com.nyl.orderlybroadcast.AnotherBroadcastReceiver"); /** * sendOrderedBroadcast()方法接收两个参数:第一个参数是intent * 第二个是一个与权限相关的字符串,这里传入null就行了 */ sendOrderedBroadcast(intent,null); } }
注:如果把AnotherBroadcastReceiver的abortBroadcast()这个方法注释掉,那么AnotherBroadcastReceiver1也会收到广播,按照配置的接收优先级顺序,AnotherBroadcastReceiver会先接收到,然后才到AnotherBroadcastReceiver1,效果如下图:
关于广播的内容介绍就这么多,内容有写得不对的地方,欢迎广大园友指正!