简介
广播,即就类似于我们生活中的电台广播一样,只负责说,不管你听不听<你听,就做出相应的响应;不听,也没有人强迫你>
广播机制最大的特点就是发送方并不关心接收方是否接到数据,也不关心接收方是如何处理数据的;
Android中广播的是操作系统中产生的各种各样的事件。例如,收到一条短信就会产生一个收到短信息的事件。而Android操作系统一旦内部产生了这些事件,就会向所有的广播接收器对象来广播这些事件。
Android广播机制包含三个基本要素:广播(Broadcast) - 用于发送广播;广播接收器(BroadcastReceiver) - 用于接收广播;意图内
容(Intent)-用于保存广播相关信息的媒介。Broadcast是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对
发送出来的Broadcast进行过滤接受并响应的一类组件。
广播分有序广播和无需广播
有序广播:
故名思义:是有顺序的,是按照我们定义的广播接受者的优先级进行接受,优先级高的最先接受到发送的广播,优先级低的较晚;当然优先级高的可以中断广播的发送,则优先级低的则不能接受到广播
接受广播App:
public class OneBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null) {
if ("Receiver".equals(intent.getAction())) {
String resultData = getResultData();
Log.i("==Receiver==One",resultData);
setResultData("领导发1000红包");
}
}
}
}
public class TwoBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null) {
if ("Receiver".equals(intent.getAction())) {
String resultData = getResultData();
Log.i("==Receiver==Two",resultData);
abortBroadcast();
}
}
}
}
public class ThreeBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null) {
if ("Receiver".equals(intent.getAction())) {
Log.i("==Receiver==Three", getResultData() + "");
}
}
}
}
接受广播App清单文件注册:
<uses-permission android:name="com.android.permission.RECEIVER"/>
<permission android:name="com.android.permission.RECEIVER"/>
<!-- 自定义发送方权限(谁有权给我发送广播) -->
<receiver
android:name=".OneBroadcastReceiver"
android:permission="com.android.permission.SEND"> // 发送方的权限
<intent-filter android:priority="1000">
<action android:name="Receiver"/>
</intent-filter>
</receiver>
<receiver
android:name=".TwoBroadcastReceiver"
android:permission="com.android.permission.SEND">
<intent-filter android:priority="100">
<action android:name="Receiver"/>
</intent-filter>
</receiver>
<receiver
android:name=".ThreeBroadcastReceiver"
android:permission="com.android.permission.SEND">
<intent-filter android:priority="10">
<action android:name="Receiver"/>
</intent-filter>
</receiver>
发送广播App:
public class FinalBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null) {
if ("Receiver".equals(intent.getAction())) {
Log.i("==Receiver==Final",getResultData());
}
}
}
}
发送广播App清单文件配置:
<uses-permission android:name="com.android.permission.SEND"/>
<permission android:name="com.android.permission.SEND"/>
<!-- 发送方的权限<接受方具有该权限的广播才能接受> -->
<receiver
android:name=".FinalBroadcastReceiver">
<intent-filter>
<action android:name="Receiver"/>
</intent-filter>
</receiver>
发送广播:
Intent intent = new Intent();
intent.setAction("Receiver");
//sendOrderedBroadcast(intent, "com.android.permission.RECEIVER");
sendOrderedBroadcast(intent, //意图动作,指定action动作
"com.android.permission.RECEIVER", //receiverPermission,接收这条广播具备什么权限
new FinalBroadcastReceiver(), //resultReceiver,最终的广播接受者,广播一定会传给他
null, //scheduler,handler对象处理广播的分发
0, //initialCode,初始代码
"领导发2000元红包", //initialData,初始数据
null);//initialExtras,额外的数据,如果觉得初始数据不够,可以通过bundle来指定其他数据
结果展示:
12-14 11:40:36.760 17537-17537/com.example.receiver I/==Receiver==One: 领导发2000元红包
// 权限高的先收到,低的后收到
12-14 11:40:36.764 17537-17537/com.example.receiver I/==Receiver==Two: 领导发1000红包
// 被拦截了的,无法收到 (Three就没有收到)
12-14 11:40:36.770 16848-16848/com.example.send I/==Receiver==Final: 领导发1000红包
// 被指定的最终广播,都会被收到
被指定的最终广播可以理解为: 我发出广播,希望知道最终的结果执行得如何;当然也可以不指定最终广播
无序广播:
与有序广播不同,是没有顺序的,只要注册了该类型,就可以接受该类型的广播,无先后顺序的
注意:
1、在新版的,增加了权限的概念,只有具有某权限,才能接收到特定的广播《权限解释同上有序广播中的权限》;
2、默认情况下,广播接收器也是运行在UI线程,因此,onReceive方法中不能执行太耗时的操作。否则将会出现ANR;
3、可以使用LocalBroadcastManager类发送只限于应用内接受的广播
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
Intent intent = new Intent();
intent.setAction("BroadcastReceiver");
localBroadcastManager.sendBroadcast(intent);