安卓允许用户发送自定义广播(broadcast),满足接收条件的接收器(receiver)就可以接受自定义广播。
发送自定义广播
自定义广播分为标准(无序)自定义广播以及有序自定义广播:
sendBroadcast(Intent intent); //发送标准自定义广播
sendOrderedBroadcast(Intent, null); //发送有序自定义广播
标准自定义广播是任何满足条件的接收器都可以接受。
有序自定义广播的第二个参数是接受权限,一般为null。有序广播接收器可以设置接收优先级priority,优先级高的先收到广播,并且可以设置截断广播,这样之后的接收器就无法接受广播。
接受自定义广播
接受自定义广播一般使用静态接受,即在AndroidManifest.xml中注册接收器,这样应用即使未运行,也可以响应广播:
<manifest>
......
<application>
......
<receiver android:name=".MyBroadcast(接收器类)">
<intent-filter android:priority="100(优先级)">
<action android:name="MY_BROADCAST(自定义的广播)" />
</intent-filter>
</receiver>
......
</application>
</manifest>
示例
我们新建2个工程:BroadcastTest1和BroadcastTest2。BoardcastTest1的主活动中添加一个按钮发送自定义的广播"Example.MY_Broadcast",然后两个工程中都添加接收器用来接收这个广播,接收后弹出toast通知。项目1的toast要比项目2的先提示。
先来写项目1发送广播,发送广播要利用Intent类的实例,如下:
//BroadcastTest1.MainActivity: 项目1的主活动发送广播
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
... ...
Button button =(Button)findViewById(R.id.button_broadcast);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("Example.MY_BROADCAST");
sendOrderedBroadcast(intent, null);
}
});
... ...
}
}
第一个项目的接收器类,继承BroadcastReceiver并重写其中的onReceive()方法,这个方法就是接收器接收到广播后要执行的,注意的是不要写太多内容,如果onReceive()方法执行时间过长会报错:
//BroadcastTest1.MyBroadcastReceiver:项目1的接收器类
public class MyBoardcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "BroadcastTest1:Example.MY_BROADCAST", Toast.LENGTH_LONG).show;
}
}
之后要在项目1的主配置文件中注册接收器,并设置优先级为100:
<!--BraodcastTest1.AndroidManifest.xml-->
<manifest ......>
<application ......>
......
<receiver android:name=".MyBroadcastReceiver">
<intent-filter android:priority="100">
<action android:name="Example.MY_BROADCAST" />
<intent-filter>
</receicer>
......
</application>
</manifest>
接下来写项目2的接收器,基本上与项目1相同,不过我们不设置优先级,这样一定会先提示项目1的toast。如下:
//BroadcastTest2.MyBroadcastReceiver:项目2的接收器类
public class MyBoardcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "BroadcastTest2:Example.MY_BROADCAST", Toast.LENGTH_LONG).show;
}
}
<!--BraodcastTest2.AndroidManifest.xml-->
<manifest ......>
<application ......>
......
<receiver android:name=".MyBroadcastReceiver">
<intent-filter>
<action android:name="Example.MY_BROADCAST" />
<intent-filter>
</receicer>
......
</application>
</manifest>
编译下两个工程测试吧,项目中其他的部分请自行完善。另外,一些非原生安卓ROM实现静态接受广播需要给应用“自动运行”权限。
关于截断广播
截断广播在接收器类中使用abortBroadcast()方法,我们修改项目1的接收器类,加上这个方法:
//BroadcastTest1.MyBroadcastReceiver:项目1的接收器类
public class MyBoardcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "BroadcastTest1:Example.MY_BROADCAST", Toast.LENGTH_LONG).show;
abortBroadcast();
}
}
再次编译项目1测试,这次只有项目1的toast通知,没有项目2的toast通知。