3.4 广播
广播(Broadcast),看字面意思可以联想到车站、商场等都有广播,对于广播来说,发送方并不需要知道广播接收方的数量及接收到广播如何反应,这些都是接收方的事。那么,在Android 平台中的广播是否与生活中的广播相似呢?答案是肯定的,发送方仅需要将广播内容完成发送,而接收方过滤自己需要的广播信息和内容,然后进行处理,接收方信息是发送方不知道的。
3.4.1 Android 系统中的广播
Android 系统中有非常多的广播,当系统启动或应用运行时便会向 Android 注册各种广播,Android 系统接收到广播后,会判断哪种广播需要哪种事件。广播事件的筛选由Android 系统完成,在接收广播时,程序员仅需要定义广播的过滤器,即接收什么样的广播内容。
从定义来讲,广播主要分发送方和接收方,Android中的广播也是如此。Android中广播的接收方处理逻辑相对复杂一些,首先要注册广播过滤器并继承abstract class BroadcastReceiver实现广播接收的onReceive方法。
3.4.2 Broadcast接收
首先创建自己的Broadcast广播接收类MyRecvBroadcast,可以不依赖Activity,其代码详情如下:
public class MyRecvBroadcast extends BroadcastReceiver {
//Android工程中的任何类,继承BroadcastReceiver类,并覆盖onReceiver方法
@Override
public void onReceive(Context context, Intent intent) {
StringBuffer str = new StringBuffer("Recive Broadcast action:");
str.append(intent.getAction());
str.append(", Message:");
str.append(intent.getStringExtra("message"));
System.out.println(str);
}
}
Android中主要采用两种方式增加广播过滤器。
1)在广播接收方应用的AndroidManifest.xml配置信息文件中增加过滤信息和内容,在application节点中加入如下XML配置信息:
<receiver android:name="com.myandroid.MyRecvBroadcast">
<intent-filter>
<action android:name="static_broadcast" />
</intent-filter>
</receiver>
2)在程序中通过代码增加广播过滤信息和内容,这些代码可以在Application或Activity的onCreate增加广播过滤器的注册,但同时需要注意在对应的生命周期里注销Broadcast的广播过滤器,可参考如下代码内容:
IntentFilter intentfilter = new IntentFilter();//Intent过滤器
intentfilter.addAction("dynamic_broadcast");//过滤器增加Intent过滤内容
MyRecvBroadcast mrb = new MyRecvBroadcast();
registerReceiver(mrb, intentfilter);//向系统注册MyRecvBroadcast广播接收器及Intent过滤器
3.4.3 Broadcast发送
广播发送有三种形式,即sendBroadcast ()、sendOrderedBroadcast()、sendStickyBroadcast()。我们重点看sendBroadcast方式,发送广播的代码如下:
Intent intent = new Intent(); //广播均通过Intent进行发送
intent.setAction("dynamic_broadcast"); //Action类型,接收方可通过Action类型进行过滤
intent.putExtra("message", "send broadcast");//广播数据
sendBroadcast(intent); //发送广播
intent.setAction("static_broadcast");
intent.putExtra("message", "send broadcast");
sendBroadcast(intent);
Broadcast相比Handler异步消息处理、AIDL跨应用服务访问要简单得多,这是由广播的特性决定的。广播只管发,不管接收方及相关处理,并且在Android中广播的具体实现已经交给了系统来完成。