【Android组件内核面试题】BroadcastReciver的静态注册与动态注册的区别?

本文讲述了Android中BroadcastReceiver的静态注册和动态注册的区别,包括它们的使用场景、发送和接收机制以及生命周期。还介绍了标准广播和有序广播的特点,并提到了本地广播作为解决安全问题的方案。
摘要由CSDN通过智能技术生成

BroadcastReciver的静态注册与动态注册的区别?

这道题想考察什么?
  1. 是否了解广播真实场景使用,是否熟悉广播使用场景?
考察的知识点
  1. 广播在项目中使用与基本知识
考生应该如何回答
1.请问BroadcastReciver的静态注册与动态注册的区别?,你在开发中用过吗?

答:

其实广播分为两种基本类型:

在一个程序中,可以发送广播供当前程序的广播接收器收到。首先我们来看下两种方式的发送广播。
在Android系统中,主要有两种基本的广播类型:
- 标准广播(Normal Broadcasts)
- 有序广播(Ordered Broadcasts)

标准广播:

是一种完全异步执行的广播,在广播发出之后,所有的广播接收器会在同一时刻接收到这条广播,广播无法被中断。

发送广播的方式十分容易的,只需要实例化一个Intent对象,然后调用context的** sendBroadcast() **方法。这样就完成了广播的发送。

        //intent中的参数为action
        Intent intent=new Intent("com.example.dimple.BROADCAST_TEST");
        sendBroadcast(intent);

有序广播:

是一种同步执行的广播,在广播发出之后,优先级高的广播接收器会先接收到这条广播,并可以在优先级较低的广播接收器之前终止发送这条广播。

        //intent中的参数为action
        Intent intent=new Intent("com.example.dimple.BROADCAST_TEST");
        sendOrderBroadcast(intent,null);//第二个参数是与权限相关的字符串。

到此时,如果你的程序中只有一个广播接收器的话,是体现不出有序广播的特点的,
右击包名——New——Other——BroadcastReceiver多创建几个广播接收器。

此时你还是会发现,所有的广播接收器是同时接收到广播消息的。注意上面介绍的时候说到优先级,这个时候我们需要设置优先级,在AndroidManifest文件中的Receiver标签中设置广播接收器的优先级。

        <receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true">
            <!--注意此时有一个Priority属性-->
            <intent-filter android:priority="100">
                <action android:name="android.intent.action.BROADCAST_TEST"></action>
            </intent-filter>
        </receiver>

优先级越高的广播接收器优先收到广播,也可以在收到广播的时候调用**abortBroadcast()**方法截断广播。优先级低的广播接收器就无法接收到广播了。

面试官,假设我有一个接收者如下:

在Android的广播接收机制中,如果接收到广播,就需要创建广播接收器。而创建广播接收器的方法就是新建一个类(可以是单独新建类,也可以是内部类(public)) 继承自BroadcastReceiver

   class myBroadcastReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            //接收到广播的处理,注意不能有耗时操作,当此方法长时间未结束,会报错。
            //同时,广播接收器中不能开线程。
        }
    } 

面试官,接下来就是面临注册的问题了,有两种注册方式,一种是动态注册,一种是静态注册

所谓动态注册是指在代码中注册。步骤如下 :

  • 实例化自定义的广播接收器。
  • 创建IntentFilter实例。
  • 调用IntentFilter实例的addAction()方法添加监听的广播类型。
  • 最后调用Context的registerReceiver(BroadcastReceiver,IntentFilter)动态的注册广播。

这个时候,已经为我们自定义的广播接收器关联了广播,当收到和绑定的广播一直的广播的时候,就会调用广播接收器中的onReceiver方法。

        MyBroadcastReceiver myBroadcastReceiver=new MyBroadcastReceiver();
        IntentFilter intentFilter=new IntentFilter();
        intentFilter.addAction("com.example.dimple.MY_BROADCAST");
        registerReceiver(myBroadcastReceiver,intentFilter);

这里需要注意的是,如果需要接收系统的广播(比如电量变化,网络变化等等),别忘记在AndroidManifest配置文件中加上权限。另外,动态注册的广播在活动结束的时候需要取消注册:

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(myBroadcastReceiver);
    }  

静态注册:

在创建好的广播接收器中添加一个Toast提示。代码如下:

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"开机启动!",Toast.LENGTH_LONG).show();
    }  
} 

然后在AndroidManifest文件中添加:

  • 权限
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>

  • Intent-filter

            <receiver
                android:name=".MyReceiver"
                android:enabled="true"
                android:exported="true">
                <!--添加以下3行-->
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED"></action>
                </intent-filter>
            </receiver>
    

    此时重启Android系统就可以收到开机提示了。

总结:

动态注册静态注册的不同:

动态注册的广播接收器可以自由的实现注册和取消,有很大的灵活性。但是只有在程序启动之后才能收到广播,此外,不知道你注意到了没,广播接收器的注销是在onDestroy()方法中的。所以广播接收器的生命周期是和当前Activity的生命周期一样。

静态注册的广播不受程序是否启动的约束,当应用程序关闭之后,还是可以接收到广播。

标准广播和有序广播的接收和发送都是全局性的,这样会使得其他程序有几率接收到广播,会造成一定的安全问题。为了解决这个问题,Android系统中有一套本地广播的机制。这个机制是让所有的广播事件(接收与发送)都在程序内部完成。主要是采用的一个localBroadcastReceiver对广播进行管理。

最后

我整理了一套Android面试题合集,除了以上面试题,还包含【Java 基础、集合、多线程、虚拟机、反射、泛型、并发编程、Android四大组件、异步任务和消息机制、UI绘制、性能调优、SDN、第三方框架、设计模式、Kotlin、计算机网络、系统启动流程、Dart、Flutter、算法和数据结构、NDK、H.264、H.265.音频编解码、FFmpeg、OpenMax、OpenCV、OpenGL ES
在这里插入图片描述

有需要的朋友可以扫描下方二维码,免费领取全部面试题+答案解析!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值