美文网首页
四大组件 —— BroadcastReceiver

四大组件 —— BroadcastReceiver

作者: leap_ | 来源:发表于2020-04-30 17:13 被阅读0次

    AS入门(九) 组件篇之Broadcast Receiver
    Android四大组件:BroadcastReceiver史上最全面解析

    作用:

    监听应用发出的广播,做出响应,不同App之间,系统应用的通信

    广播的种类:

    • 普通广播:普通广播发出后,会同时发送给所有的广播接收器,不可以被拦截


      普通广播
    • 有序广播:有序广播发送后,在同一时刻只会被一个接收器接收,会根据接收器的优先级决定谁先接收,可以被拦截,拦截后后续的接收器将无法收到


      有序广播
    特殊广播:
    1. 本地广播:只能被当前app接收,解决全局广播的安全性问题
    2. 粘性广播sticky:广播会滞留直到可以接收的接收器被注册(类似EventBus的粘性事件)已废弃
    3. 系统广播:Android中内置了多个系统广播:只要涉及到手机的基本操作(如开机、网络状态变化、拍照等等),都会发出相应的广播

    实现原理:

    基于观察者模式:被观察者(广播发送方) 通知观察者(广播接收方)做出响应;

    1. 广播接收者通过Binder在AMS中注册
    2. 广播发送方通过Binder将广播发送给AMS
    3. AMS根据广播的intentFilter选择合适的广播接收者,回调onReceive()

    广播接收器注册:

    1. 静态注册:在AndroidManifest.xml里通过标签声明
      特点:不受生命周期影响,程序关闭后任然有效,耗内存,耗电
    1. 动态注册:在代码中通过Context.registerReceiver()注册
      特点:跟随组件的生命周期变化
    两种方式的对比

    广播的发送:

    1.普通广播
    Intent intent = new Intent();
    //对应BroadcastReceiver中intentFilter的action
    intent.setAction(BROADCAST_ACTION);
    //发送广播
    sendBroadcast(intent);
    
    2. 有序广播
    sendOrderedBroadcast(intent);
    
    3. 本地广播
    • 将exported属性设置为false
    • 通过intent.setPackage(packageName)指定报名
    • 使用LocalBroadcastManager发送(本地广播接收器只能通过LocalBroadcastManager动态注册)
    //注册应用内广播接收器
    //步骤1:实例化BroadcastReceiver子类 & IntentFilter mBroadcastReceiver 
    mBroadcastReceiver = new mBroadcastReceiver(); 
    
    //步骤2:实例化LocalBroadcastManager的实例
    localBroadcastManager = LocalBroadcastManager.getInstance(this);
    
    //步骤3:设置接收广播的类型 
    IntentFilter intentFilter = new IntentFilter(); 
    intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);
    
    //步骤4:调用LocalBroadcastManager单一实例的registerReceiver()方法进行动态注册 
    localBroadcastManager.registerReceiver(mBroadcastReceiver, intentFilter);
    
    //发送应用内广播
    Intent intent = new Intent();
    intent.setAction(BROADCAST_ACTION);
    localBroadcastManager.sendBroadcast(intent);
    
    //取消注册应用内广播接收器
    localBroadcastManager.unregisterReceiver(mBroadcastReceiver);
    

    注意点:

    • 动态注册的广播需要手动注销
    • 不允许重复注册,重复注销
    • onResume()注册,onPause()注销,因为activity在销毁前一定会执行Pause;
    • 接收器的onReceive()是UI线程,不可以进行耗时操作
    • 不同注册方式的广播接收器回调OnReceive(Context context,Intent intent)中的context返回值是不一样的;

    相关文章

      网友评论

          本文标题:四大组件 —— BroadcastReceiver

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