Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器)。广播作为Android组件间的通信方式,可以使用的场景如下:
1.同一app内部的同一组件内的消息通信(单个或多个线程之间);
2.同一app内部的不同组件之间的消息通信(单个进程);
3.同一app具有多个进程的不同组件之间的消息通信;
4.不同app之间的组件之间消息通信;
5.Android系统在特定情况下与App之间的消息通信。
静态注册:
所谓动态注册是指在代码中注册。步骤如下 :
- 实例化自定义的广播接收器。
- 创建IntentFilter实例。
- 调用IntentFilter实例的addAction()方法添加监听的广播类型。
- 最后调用Context的registerReceiver(BroadcastReceiver,IntentFilter)动态的注册广播。
定义一个广播接收器继承BroadcastReceiver
public class MyReceiver extends BroadcastReceiver {
public MyReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
//接收到广播的处理,注意不能有耗时操作,当此方法长时间未结束,会报错。
//同时,广播接收器中不能开线程。
Toast.makeText(context,intent.getStringExtra("info"),Toast.LENGTH_SHORT).show();
}
}
AndroidManifest.xml
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<!-- 静态注册广播 -->
<!-- intent过滤器,指定可以匹配哪些intent, 一般需要定义action 可以是自定义的也可是系统的 -->
<intent-filter>
<!--action-->
<action android:name="com.broadcast.test" />
</intent-filter>
</receiver>
//静态注册广播
Intent intent=new Intent();
//与清单文件的receiver的anction对应
intent.setAction("com.broadcast.test");
intent.putExtra("info","测试静态注册广播");
//发送广播
sendBroadcast(intent);
动态注册:
定义一个广播接收器继承BroadcastReceiver
public class DynamicReceiver extends BroadcastReceiver {
public DynamicReceiver () {
}
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,intent.getStringExtra("name"),Toast.LENGTH_SHORT).show();
}
}
//动态注册广播
dynamicReceiver = new DynamicReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.broadcast.test2");
registerReceiver(dynamicReceiver, intentFilter);
//发送信息
Intent intent=new Intent();
intent.setAction("com.broadcast.test2");
intent.putExtra("name", "动态注册广播");
sendBroadcast(intent);
//需要在需要组件销毁后,解除广播注册
unregisterReceiver(dynamicReceiver);
广播两种基本类型
在一个程序中,可以发送广播供当前程序的广播接收器收到。首先我们来看下两种方式的发送广播。
在Android系统中,主要有两种基本的广播类型:
- 标准广播(Normal Broadcasts)
- 有序广播(Ordered Broadcasts)
标准广播
是一种完全异步执行的广播,在广播发出之后,所有的广播接收器会在同一时间接收到这条广播,广播无法被截断。
发送广播的方式十分简单,只需要实例化一个Intent对象,然后调用context的* sendBroadcast() *方法。
//intent中的参数为action
Intent intent=new Intent("com.example.dimple.BROADCAST_TEST");
sendBroadcast(intent);
这样就完成了广播的发送,至于接收呢,需要用到广播接收器,这个下面会写到。
有序广播
是一种同步执行的广播,在广播发出之后,优先级高的广播接收器可以优先接收到这条广播,并可以在优先级较低的广播接收器之前截断停止发送这条广播。
至于有序广播:
//intent中的参数为action
Intent intent=new Intent("com.example.dimple.BROADCAST_TEST");
sendOrderBroadcast(intent,null);//第二个参数是与权限相关的字符串。
到此时,如果你的程序中只有一个广播接收器的话,是体现不出有序广播的特点的,
右击包名——New——Other——BroadcastReceiver多创建几个广播接收器。
此时你还是会发现,所有的广播接收器是同时接收到广播消息的。注意上面介绍的时候说到优先级,这个时候我们需要设置优先级,在AndroidManifest文件中的Receiver标签中设置广播接收器的优先级。
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<!--注意此时有一个Priority属性-->
<intent-filter android:priority="100">
<action android:name="android.intent.action.BROADCAST_TEST"></action>
</intent-filter>
</receiver>
优先级越高的广播接收器可以先收到广播,也可以在收到广播的时候调用abortBroadcast()方法截断广播。优先级低的广播接收器就无法接收到广播了。
总结:
静态注册:在AndroidManifest.xml注册,android不能主动主动销毁广播接收器,也就是说应用关闭后,还是会接收到广播。
动态注册:在代码中可以手动使用registerReceiver()方法注册,当程序关闭,该广播接收器随之销毁,也可以手动调用unrigesterReceiver()方法取消注册。
android:enabled:
这个属性用于定义系统是否能够实例化这个广播接收器,如果设置为true,则能够实例化,如果设置为false,则不能被实例化,默认设置为ture。
<application>元素有它自己的enabled属性,这个属性会应用给应用程序的所有组件,
包括广播接收器。<application>和<receiver>元素的这个属性都必须是true,这个广播接收器才能够被启用。如果有一个被设置为false,该广播接收器会被禁止实例化。
android:exported:
这个属性用于指示该广播接收器是否能够接收来自应用程序外部的消息,如果设置为true,则能够接收,如果设置为false,则不能接收。如果设置为false,该接收器只能接收由当前应用程序组件或者带有相同用户ID的应用程序所发出的消息。