android 四大组件之Broadcast Receiver(

2017-05-22  本文已影响0人  WeiAai

广播分为两种,一种是标准的广播,完全的异步执行,广播发出之后,所有的广播接收器几乎在同一时间接收到这条广播信息,这种广播效率较搞高,同时也是无法截断的。第二种是有序广播,是一种同步执行的广播,广播发出之后同时只有一个广播接收器可以接收到,这个广播接收器的逻辑执行完之后才会继续传递,这中广播是有先后顺序的,所以他是可以被拦截 的,拦截后后面的广播就无法接收到了。

首先我们来接受系统广播

广播接收器可以自由的对自己感兴趣的广播进行注册,当有相应的广播发出时广播接收器就能收到该广播,并且在内部处理相应的逻辑,接下来就来用监听网络变化这条广播

首先是动态监听

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); 

上一篇下一篇

猜你喜欢

热点阅读