BroadcastReceiver是用来接收广播的组件,当系统或者某个程序发送广播时,就可以用它来接收并做出响应。而发送广播则主要使用sendBroadcast()、sendOrderedBroadcast()方法通过Intent对象发送广播。接收广播需要注册,注册可以在代码中动态注册,也可以在Manifest文件中静态注册,静态注册的广播接收器在应用程序关闭后依然可以接收到注册的相应广播,而动态的则不可以。
实例一:动态注册屏幕开/关广播接收器
public class MainActivity extends ActionBarActivity {
// 通过匿名内部类创建一个BroadcastReceiver对象
private BroadcastReceiver screenOnReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context arg0, Intent arg1) {
// TODO Auto-generated method stub
System.out.println(arg1.getAction()); // 接收到广播则打印出该广播的action
}
};
private BroadcastReceiver screenOffReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context arg0, Intent arg1) {
// TODO Auto-generated method stub
System.out.println(arg1.getAction());
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
IntentFilter filterOn = new IntentFilter(); // 创建一个IntentFilter对象
filterOn.addAction(Intent.ACTION_SCREEN_ON); // 指明过滤的action,这是屏幕亮的系统广播
registerReceiver(screenOnReceiver, filterOn); // 注册广播接收器
IntentFilter filterOff = new IntentFilter();
filterOff.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(screenOffReceiver, filterOff);
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
unregisterReceiver(screenOnReceiver); // 最后取消注册
unregisterReceiver(screenOffReceiver);
}
}
锁屏时,系统发出一个Intent.ACTION_SCREEN_OFF的广播,程序接收到后执行onReceive方法,打印:
android.intent.action.SCREEN_OFF
解锁时也是同理的
动态注册广播接收器还是很简单的:①创建BroadcastReceiver对象,重写接收到广播后要执行的方法;②创建IntentFilter对象,指明要过滤出来的action;③调用registerReceiver方法注册广播接收器;④最后记得调用unregisterReceiver方法取消注册就好啦。实例二:静态注册广播接收器+发送自定义广播
①为了模拟静态注册的广播接收器即使在程序关闭后依然可以接收到广播,新建一个只含有一个Button的工程,用这个Button来发送自定义广播。
②新建一个工程,里面新建一个类继承BroadcastReceiver类,并在Manifest文件中静态注册该接收自定义广播的广播接收器
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context arg0, Intent arg1) {
// TODO Auto-generated method stub
System.out.println(arg1.getAction());
}
}
在application节点下面添加一个receiver节点,指明要过滤的action
③用①的button发送自定义广播
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setAction("leelit.intent.action.MY_BROADCAST"); // 指明action
sendBroadcast(intent); // 发送标准广播
}
});
同时运行两个应用,然后点击button,打印:
leelit.intent.action.MY_BROADCAST
即使关闭接收广播的应用,点击button依然会打印上述语句,因为静态注册的广播接收器在程序关闭后依然可以接收到广播。
实例三:发送有序广播
实例二发送的标准广播相当于一种无序的广播,就是发出后,可以接收到的都会接收到,而发送有序广播后,广播接收器则是一个一个依次接收的,甚至可以在接收到广播后将其截断不再继续发送下去。
①新建一个工程,新建一个类继承BroadcastReceiver类,在Manifest文件中静态注册广播接收器,注意接收的是和实例二中同样的广播!运行这个程序
②修改button代码,运行此程序
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setAction("leelit.intent.action.MY_BROADCAST"); // 指明action
sendOrderedBroadcast(intent, null); // 发送有序广播
}
});
点击button后,打印两条leelit.intent.action.MY_BROADCAST,一条是实例二的应用接收的,另外一条是实例三的应用接收的。如果我们在实例二的onReceive方法中调用abortBroadcast()方法后运行程序。再次点击button,此时只会打印出一条,因为后面的实例三已经无法接收到这个被截断的广播了。如果我们想要调整接收广播的优先级,只需要在intent-filter节点中添加priority属性即可,值越高代表越先收到广播。事实上发送标准广播某种意义上也是有序的,只是他不可能被打断,能接收到的都会接收到。
静态注册广播接收器同样简单:①新建一个类继承BroadcastReceiver类,重写onReceive方法;②在Manifest文件中application节点下添加receiver节点,指明要过滤出来的action。