美文网首页
android 四大组件之Broadcast Receiver(

android 四大组件之Broadcast Receiver(

作者: WeiAai | 来源:发表于2017-05-22 13:46 被阅读0次

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

    首先我们来接受系统广播

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

    首先是动态监听

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

    相关文章

      网友评论

          本文标题:android 四大组件之Broadcast Receiver(

          本文链接:https://www.haomeiwen.com/subject/blpvxxtx.html