Android  面试 广播那些事

2019-04-21  本文已影响0人  Dapengyou

广播的种类

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

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

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

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

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

使用方式

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

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

特点

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

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

应用场景

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

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

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

广播的原理

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

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

原理简述:

上一篇 下一篇

猜你喜欢

热点阅读