在Android中,广播是一种在组件之间传递消息的机制,例如电池电量低时会发送一条提示如果要接收并过滤广播中的消息,则需要使用Broadcast Receiver(广播接收者)。
广播接收者是Android四大组件之一,通过广播接收者可以监听系统中的广播消息,实现在不同组件之间的通信。常用于不同App间通信。
一、广播接收者BroadcastReceiver
在现实生活中,很多人会收听广播,例如出租车司机会收听实时路况广播,关注路面拥堵情同样Android中也内置了很多广播,例如手机开机完成后会发送一条广播,电池电量不足时也会发送一条广播等。为了监听这些广播事件,Android提供了一个广播接收者组件,该组件可以监听来自系统或者应用程序的广播。
当Android产生一个广播事件时,可以有多个对应的广播接收者接收并进行处理,这些广播接收者只需要在清单文件或者代码中进行注册并指定要按收的广播事件,然后创建一个继承BroadcastReceiver的类,在该类中重写onReceive()方法,并在onReceiver()方法中对广播事件进行处理。
1.创建广播接收者
(1)第一种创建方式
在AndroidStudio中创建一个继承BroadcastReceiver的MyBroadcastReceiver类,并重写onReceiver()方法。
//例
public class MyBroadcastReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
throw new UnsupportedOperationException("Not yet implemented");
}
}
(2)第二种创建方式
选中应用程序的包,单击鼠标右键并选择[NEW]→[Other]→[Broadcast Receiver]选项,会弹出一个Configure Component页面。
页面中[ClassName]表示要创建的广播接收者的名称,[Exported]表示是否接收当前程序之外的广播,[Enable]表示广播接收者是否可以由系统实例化;[SauceLanguage]表示编写源码所用的语言。[Exported]和[Enable]默认是勾选的,[SouceLanguage]的选项中有[Java]和[Kotlin],选择默认的[Java]选项即可。单击"Finish"锡钮,广播接收者便创建完成。
//例
public class MyBroadcastReceiver extends BroadcastReceiver {
public MyBroadcastReceiver(){
}
public void onReceive(Context context, Intent intent) {
throw new UnsupportedOperationException("Not yet implemented");
}
}
在上述代码中,创建的广播技收者MyReceiver默认重写构造,函数MyReceiver()与onReceiver()方法。其中,onReceive()方法用于接收发送的广播消息,实现广播接收者的相关操作,该方法在此处暂未实现,程序默认抛出了一个未支持操作异常UnsuportedOperationErception,在后续程宇实现onReceive()方法时,删除该异常即可。
2.注册广播接收者
广播接收者的注册方式有两种,分别是动态注册和静态注册。动态注册是在Activity中通过代码注册广播接收者,静态注册是在清单文件中通过配置广播接收者完成注册。需要注意的是,在Android8.0版本之后的系统中,通过静态注册方式注册的广播接收者已经接收不到广播了,必须通过动态注册才可以接收广播。
(1)动态注册
在MainActivity中动态注册广播接收者MyBroadcastReceiver的具体代码如下:
registerReceiver( receiver , intentFilter )方法用于注册广播接收者,两个参数分别为光比接收者对象及意图过滤器(用于接收指定的广播)。
unregisterReceiver( receiver )方法用于注销广播接收者,参数为广播接收者对象。
public class MainActivity extends AppCompatActivity {
private MyBroadcastReceiver receiver;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建广播接收者对象
receiver=new MyBroadcastReceiver();
//创建过滤器,用于接收指定的广播
String action="MyAction";
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction(action);
//注册广播接收者,参数为广播接收者对象及过滤器
registerReceiver( receiver , intentFilter );
}
protected void onDestory(){
super.onDestory();
//注销广播接收者
unregisterReceiver( receiver );
}
}
动态注册的广播接收者是否被销毁依赖于注册广播接收者的组件,例如在Activity中注册了广播接收者,当Activity销毁时广播接收者也会被注销。
(2)静态注册
通过第2种方式创建广播接收者之后,AndroidStudio会自动在AndridManifest.xml文件中静态注册广播接收者。
<application
... ... >
<receiver
android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
</receiver>
</application>
enabled属性表示是否可由系统实例化。
exported属性表示是否可接收当前程序外的广播。
二、广播的发送、接收
1.发送广播
//创建广播Intent,即包含action属性的Intent
Intent intent=new Intent();
intent.setAction( "myTestBroadcast" );
//发送广播
sendBroadcast(intent);
2.接收广播
//创建自定义的内容接收者对象
MyBroadcastReceiver myBroadcastReceiver=new MyBroadcastReceiver();
//创建过滤器,用于接收指定的广播(本例中为action属性为"myTestBroadcast"的广播)
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction( "myTestBroadcast" );
//注册广播接收者
registerReceiver(myBroadcastReceiver,intentFilter);
protected void onDestory(){
super.onDestory();
//注销广播接收者
unregisterReceiver( receiver );
}
三、广播类型
Andrid中提供了两种广播类型,分别是无序广播和有序广播。
1.无序广播
无序广播是完全异步执行的,发送广播时,所有监听这个广播的广播接收者都会收到此广播消息,但接收和执行的顺序不确定。无序广播的效率较高,但无法被拦截。
2.有序广播
有序广播是按照广播接收者声明的优先级别被依次接收,发送广播时,只会有一个广播按收者能够接收此消息;在此广播接收者中逻辑执行完毕之后,广播才继续传递。相比无序着,有序番的广播效率较低,但此类型广播的广播接收者是有先后顺序的,并可被拦截。
(1)修改广播接收者的优先级
//创建自定义的内容接收者对象
MyBroadcastReceiver myBroadcastReceiver=new MyBroadcastReceiver();
//创建过滤器,用于接收指定的广播(本例中为action属性为"myTestBroadcast"的广播)
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction( "myTestBroadcast" );
//设置IntentFilter(意图过滤器)优先级
intentFilter.setPriority(1000);
//注册广播接收者
registerReceiver(myBroadcastReceiver,intentFilter);
(2)拦截有序广播
public class MyBroadcastReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
//拦截广播 abort-中止,夭折
abortBroadcast();
}
}