美文网首页
Android  面试 广播那些事

Android  面试 广播那些事

作者: Dapengyou | 来源:发表于2019-04-21 18:30 被阅读0次

广播的种类

Android 中的广播主要可以分为两种类型,标准广播和有序广播。

  • 标准广播:是一种完全异步执行的广播,在广播发出之后,所有的广播接收器机会都会在同一时间接收到这条广播消息,效率高同时又无法被截断
  • 有序广播:是一种同步执行的广播,广播发出后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递,所以这种类型的广播是有先后顺序的,优先级高广播接收器就可以先接收到广播消息,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了。

广播的使用

首先要自定义一个广播接收器,继承BroadcastReceiver,然后复写onReceive() 方法,像这样:

public class MyReceiver extends BroadcastReceiver {
    public static final String ACTION= "action";
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
          //接收广播后的一些逻辑,这里注意下 onReceive方法是自动调用的
            Log.d("MyReceiver", "收到广播了");
    }
}

其次,就要进行广播的注册,注册主要有两种形式:

  • 静态注册
  • 动态注册

静态注册:在AndroidManifest.xml中添加注册

<receiver
            android:name=".activity.fourComponents.MyReceiver">
            <intent-filter>
                <action android:name="myReceiver" />
            </intent-filter>
</receiver>

当App启动的时候,会自动将MyReceiver这个接收器注册在系统当中,当收到相应的广播的时候就会自动调用MyReceiver 中的onReceive() 方法。

动态注册:尽量在onResume() 和 onPause()中进行广播的注册和销毁

private MyReceiver mMyReceiver;
 if (mMyReceiver == null) {
            //  实例化BroadcastReceiver子类 &  IntentFilter
            mMyReceiver = new MyReceiver();
            IntentFilter intentFilter = new IntentFilter();
          //设置接收广播的类型
            intentFilter.addAction("myReceiver");
            //动态注册:调用Context的registerReceiver()方法
            registerReceiver(mMyReceiver, intentFilter);

        }

最后不能忘记要销毁动态广播

   //广播动态销毁
unregisterReceiver(mMyReceiver);

不管是静态注册还是动态注册,他们的共同点:

  • 自动回调onReceive() 方法
  • 广播接收器运行在UI线程

所以在广播中不能做耗时操作,否则就会导致ANR

静态注册和动态注册的区别

静态注册和动态注册的区别主要从这三个方面来看:

  • 使用方式
  • 特点
  • 应用场景
使用方式

动态注册:在代码中调用Context.registerReceiver

静态注册:在AndroidManifest.xml通过<receiver>标签声明

特点

动态注册:跟随组件的生命周期变化

静态注册:常驻进程中,不受组件生命周期影响(即使应用程序关闭,如果有广播发送,程序依然会被系统唤醒调用)

应用场景

静态注册:需要时刻监听广播(比如在性能优化时,计算每隔一段时间的网络访问量)

动态注册:需要在特定时刻接受广播(可根据业务场景选择)

广播接收器更多的是扮演一种打开程序其他组件的角色,例如创建一条状态栏通知,或者启动一个服务等。

广播的原理

Android中的广播使用了观察者模式,角色分配:

  1. 消息订阅者(广播接受者)
  2. 消息发布者(广播发布者)
  3. 消息中心(Activity Manager Service,即AMS)

原理简述:

  • 广播接收者:通过Binder 机制在 AMS 注册
  • 广播发送者:通过Binder 机制向 AMS 发送广播
  • AMS 根据广播发送者要求,在已注册列表中,寻找合适的广播接受者
  • AMS 将广播发送到合适的广播接收者相应的消息循环队列中

相关文章

  • Android  面试 广播那些事

    广播的种类 Android 中的广播主要可以分为两种类型,标准广播和有序广播。 标准广播:是一种完全异步执行的广播...

  • 广播那些事

    在八十年代的时候,一部有声小说《夜幕下的哈尔滨》的播出,引起了不小的轰动,用“万人空巷”形容一点都不为过。殊不知,...

  • 关于Android面试那些事

    清明时节,雨水纷纷。最近找工作的事情总算是告一段落了,暂时把自己安顿下来,我打算花时间整理一下面试的东西。一方面是...

  • Android Service 面试那些事

    什么是服务 服务是Android中实现程序后台运行的解决方案,它非常适合用于去执行那些不需要和用户交互而且还要求长...

  • android Ble开发的那些事(二)

    android Ble开发的那些事(一)android Ble开发的那些事(二)android Ble开发的那些事...

  • android Ble开发的那些事(三)--Ble数据分包处理

    android Ble开发的那些事(一)android Ble开发的那些事(二)android Ble开发的那些事...

  • android Ble开发的那些事(四)—— OTA升级

    android Ble开发的那些事(一)android Ble开发的那些事(二)android Ble开发的那些事...

  • Android广播

    参考:Android总结篇系列:Android广播机制Android广播机制 一. 广播 1. 广播是什么? 广播...

  • Android广播的那些事儿

    Android App可以接收来自系统和其他App的广播消息,也可以向它们发送广播消息,比较类似于“发布-订阅”的...

  • Android笔记——BroadcastReceiver

    1.0Android中的广播类型 Android中的广播主要可以分为两种类型:标准广播和有序广播。 标准广播(no...

网友评论

      本文标题:Android  面试 广播那些事

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