Android广播接收器(BroadcastReceiver)
BroadcastReceiver也是android四大组件之一,它的本质是一种系统级别的监听器,只是比普通的监听器级别高一点。
我们可以用Intent来启动一个组件,也可以用sendBroadcast()方法发起一个系统级别的事件广播来传递消息。我们同样可以在自己的应用程序中实现Broadcast Receiver来监听和响应广播的Intent。
因为它本质上是一个监听器,所以使用它的方法也就非常简单,只需要重写onReceiver()方法即可。
当 onReceive()方法在10 秒内没有执行完毕,就会导致ANR。如果需要执行长任务,那么就有必要使用Service。千万不要使用新线程,这是很危险的事情。因为有可能线程没有执行完,BroadcastReceiver就挂了。另外,BroadcastReceiver会堵塞主线程。唯有onReceive()结束,主线程才得以继续进行。
下面简要说一下它的使用方法:
它的使用还需要说明BroadcastReceiver相匹配的intent,实现这一步,可以有两种方式。
(1)在xml配置文件中说明,这种方法对资源占用比较大
<receiver android:name=".MyBroadcastReceiver" >
<intent-filter android:priority="1000" > //1000是优先级
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> //这里的名字可以只是一个普通的字符串,用来标识
</intent-filter>
</receiver>
(2)在代码中动态获取:
IntentFilter filter = new IntentFilter();
filter.addAction(android.net.conn.CONNECTIVITY_CHANGE);
filter.setPriority(Integer.MAX_VALUE);
registerReceiver(myReceiver, filter);
注:最后要记得,动态注册的广播接收器一定要取消注册才行unRegisterReceiver()。
有序广播和无序广播:
1.有序广播
广播是一种可以跨进程的通信方式,其他应用程序是可以收到的。现在我们来发一条有序广播。
有序广播不仅有先后顺序,而且前面的广播还可以将后面的广播截断。
Button button1=(Button)findViewById(R.id.button1);
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent =new Intent("android.net.conn.CONNECTIVITY_CHANGE");
sendOrderedBroadcast(intent, null);
}
});
拦截广播,可以让后边的接收器接收不到广播:
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
abortBroadcast();//拦截广播,防止后面的接收到
}
}
2.无序广播(普通广播)
Intent intent = new Intent();
//设置intent的动作为com.example.broadcast,可以任意定义
intent.setAction("com.example.broadcast");
//发送无序广播
sendBroadcast(intent);