广播分为两种,一种是标准的广播,完全的异步执行,广播发出之后,所有的广播接收器几乎在同一时间接收到这条广播信息,这种广播效率较搞高,同时也是无法截断的。第二种是有序广播,是一种同步执行的广播,广播发出之后同时只有一个广播接收器可以接收到,这个广播接收器的逻辑执行完之后才会继续传递,这中广播是有先后顺序的,所以他是可以被拦截 的,拦截后后面的广播就无法接收到了。
首先我们来接受系统广播
广播接收器可以自由的对自己感兴趣的广播进行注册,当有相应的广播发出时广播接收器就能收到该广播,并且在内部处理相应的逻辑,接下来就来用监听网络变化这条广播
首先是动态监听
privateIntentFilterintentFilter;
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intentFilter=newIntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");//想要接听什么广播就在这里添加
registerReceiver(newGuangbo(),intentFilter);
}
public classGuangboextendsBroadcastReceiver {
@Override
public voidonReceive(Context context,Intent intent) {
if(intent.getAction()=="android.net.conn.CONNECTIVITY_CHANGE"){
Toast.makeText(context,"网络发生了变化!",Toast.LENGTH_SHORT).show();
}
}
这样子我们就完成了对网络发生变化时系统发出的广播进行监听,上面的是动态进行监听的,那么有动态就有静态,下面是静态进行监听
private Intent FilterintentFilter;
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//intentFilter=new IntentFilter();
//intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");//想要接听什么广播就在这里添加
//registerReceiver(new Guangbo(),intentFilter);
}我们把在activity中的代码注释掉
public class Guangbo extends BroadcastReceiver {
@Override
public voidonReceive(Context context,Intent intent) {
if(intent.getAction()=="android.net.conn.CONNECTIVITY_CHANGE"){
Toast.makeText(context,"网络发生了变化!",Toast.LENGTH_SHORT).show();
}
}//这个不变 然后我么去修改配置文件 在配置文件中添加
<receiver android:name=".Guangbo"> //这个是你的广播接受类
<intent-Filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"></action>//需要什么就在这里监听就行了
<intent-filter>
这样子我们就能监听系统的广播了,这里有几点要提,有一些广播监听是需要权限的,如开机,在上面我的广播接收类只是简单的Toast了一下,实际开发中可以在里面编写自己的逻辑,需要注意的是,不要在onreceive()方法中添加过多的逻辑和耗时操作,因为广播接收器中是不允许开线程的,我们利用广播接收器,主要是扮演一宗打开其他组建的角色,比如创建一条状态栏通知,或者启动一个服务
学会了接受系统的广播,那么我们来自定义一条广播发出去,前面我们说了广播有两种标准,和有序,下面我们一个一个来。
标准广播
首先自定义广播接收器
public class Guangbo extends BroadcastReceiver {
@Override
public voidonReceive(Context context,Intent intent) {
if(intent.getAction()=="abc"){
Toast.makeText(context,"接收到了自定义广播!",Toast.LENGTH_SHORT).show();
}//还是这么个东西
<receiver android:name=".Guangbo">
<intent-Filter>
<activon anrodi:name="abc"></action>
</intent-filter>
</receiver> //自定义广播
privateButtonbutton;
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button= (Button) findViewById(R.id.button);
button.setOnClickListener(newView.OnClickListener() {
@Override
public voidonClick(View v) {
Intent intent =newIntent("abc");
sendBroadcast(intent);//发送广播
}
});
这样子我们就可以发送了标准自定义广播了
发送有序广播跟标准广播没有只需要把sendBroadcast(intent); 改成 sendOrderedBroadcast(intent,null); 这个第二个是传入跟权限有关的字符串 这里传null就可以了,然后我们在intent-Filter 中使用 android:priority="100" 这样就设置了接收器的优先级 获得了优先级 那么我们就可以选择是否继续传递了 我们在广播接收器中间调用 abortBroadcast()方法来截断广播
前面我们发送的都是全局广播,可以接受其他程序的说有广播,和发送广播给所有程序,这样就会带来安全问题,为了解决安全问题,android 引人了一套本机广播机制,主要是通过LocalBroadcastManager实现
LocalBroadcastManager lbm=new LocalBroadcastManager.getInstance(this);
Intent intent=new Inteent("xxxxx//广播");
lbm.sendBroadcast(intent);//发送广播
IntentFilter intentFilte=new IntentFilter();
intentFilte.addaction("xxxxx//广播");
new Guangbo().iregisterReceiver(IntentFilter);