"BroadcastReceiver"-安卓面试必问技能点大总结"

大家好,现在我们开始讲解四大组件之三-广播接收者,一下是技能点大总结,让我们详细的去了解吧.

广播接收者:

1.请描述一下BroadcastReceiver

  • 1.是四大组件之一,主要用于接收app发送的广播
  • 2.内部通信实现机制:通过android系统的Binder机制.
  • 3.广播分为两种:

    • 无序广播
      • 优点:完全异步,逻辑上可被任何接受者收到广播,效率高
      • 缺点:接受者不能讲处理结果交给下一个接受者,且无法终止广播.
    • 有序广播
      • 按被接收者的优先级循序传播
      • A>B>C,每个都有权终止广播,下一个就得不到
      • 每一个都可进行修改操作,下一个就得到上一个修改后的结果.
  • 4.最终广播者:

    • Context.sendOrderedBroadcast(intent,receiverPermission,resultReceiver,scheduler,initialCode,initialData,initialExtras)时我们可以指定resultReceiver为最终广播接收者.
    • 如果比他优先级高的接受者不终止广播,那么他的onReceive会执行两次
      • 第一次是正常的接收
      • 第二次是最终的接收
    • 如果优先级高的那个终止广播,那么还是依然收到一次最终的广播
  • 5.常见的广播接收者运用场景:

    • 开机启动,sd卡挂载,低电量,外拨电话,锁屏等
    • 比如根据产品经理要求,设计播放音乐时,锁屏是否决定暂停音乐.

2.在mainfest和代码如何注册和使用BroadcastReceiver?-一个action是重点

  • 1.情况文件注册(静态广播)

    • 只要app还在运行,那么会一直收到广播消息
    • 演示:

      • 1.一个app里:自定义一个类继承BroadcastReceiver然后要求重写onReveiver方法

        public class MyBroadCastReceiver extends BroadcastReceiver {
            @Override
            public void onReceive(Context context, Intent intent) {
                Log.d("MyBroadCastReceiver", "收到信息,内容是 : " + intent.getStringExtra("info") + "");
            }
        }
        
      • 2.清单文件注册,并设置Action,就那么简单完成接收准备工作

        
            
                
            
        
        
  • 2.代码注册(动态广播)

    • 当注册的Activity或者Service销毁了那么就会接收不到广播.
    • 演示:

      • 1.在和广播接受者相同的app里的MainActivity添加一个注册按钮,用来注册广播接收者
      • 2.设置意图过滤,添加Action

        //onCreate创建广播接收者对象
        mReceiver = new MyBroadCastReceiver();              
        
        //注册按钮
        public void click(View view) {
            IntentFilter intentFilter = new IntentFilter();
            intentFilter.addAction("myBroadcast.action.call");
            registerReceiver(mReceiver, intentFilter);
        }
        
      • 3.销毁的时候取消注册

        @Override
        protected void onDestroy() {
            unregisterReceiver(mReceiver);
            super.onDestroy();
        }
        
  • 3.在另一个app,定义一个按钮,设置意图,意图添加消息内容,意图设置action()要匹配,然后发送广播即可.

    public void click(View view) {
        Intent intent = new Intent();
        intent.putExtra("info", "消息内容");
        intent.setAction("myBroadcast.action.call");
        sendBroadcast(intent);
    }
    
  • 两个app都运行之后:静

    • 静态注册的方法:另一app直接发广播就收到了
    • 动态注册的方法:自己的app先代码注册,然后另一个app直接发广播即可.

3.BroadCastReceiver的生命周期

  • a.只有一个onReceiver, 相当的短暂,方法完成后广播接受者 就销毁,发送一次调用一次
  • b.接受者不要做耗时操作,否则出现ANR
  • c.也不要开启子线程进行耗时操作,因为生命周期结束后 整个进程就变进程了,容易被系统杀掉
  • d.耗时较长的工作最好放在服务里.

4.如何让自己的广播只让指定的app接收?

在发送广播的app端,自定义定义权限,那么想要接收的另外app端必须声明权限才能收到.

  • 1.权限,保护层级是普通正常.
  • 2.用户权限
<permission android:name="broad.ok.receiver" android:protectionLevel="normal"/>
<uses-permission android:name="broad.ok.receiver" />
  • 3.发送广播的时候加上权限字符串
public void click(View view) {
    Intent intent = new Intent();
    intent.putExtra("info", "消息内容");
    intent.setAction("myBroadcast.action.call");
    sendBroadcast(intent, "broad.ok.receiver");
    //sendOrderedBroadcast(intent,"broad.ok.receiver");
}

其他app接收者想好获取广播,必须声明在清单文件权限

<uses-permission android:name="broad.ok.receiver"/>

5.什么是最终广播接收者

(针对有序广播来说)

  • Context.sendOrderedBroadcast(intent,receiverPermission,resultReceiver,scheduler,initialCode,initialData,initialExtras)时我们可以指定resultReceiver为最终广播接收者.
  • 最终接受者可能会接收到两次:第一次:按照标准的优先级接收,第二次,作为final receiver肯定会收到.

6.广播的优先级对无序广播生效吗?

  • 优先级对无序也生效.

7.动态注册的广播优先级谁高?

  • 谁先注册,谁就高

8.如何判断当前的BrodcastReceiver接收到的是有序还是无序的广播?

  • 在onReceiver方法里,直接调用判断方法得返回值
public void onReceive(Context context, Intent intent) {
    Log.d("MyBroadCastReceiver", "收到信息,内容是 : " + intent.getStringExtra("info") + "");
    boolean isOrderBroadcast = isOrderedBroadcast();
}

9.总结:

  • 人家app发送广播,有action;那么广播接收者当然要注册广播(动/静),并声明action才能获取到广播
  • 人家发广播,有action,但是如果人家添加了权限,那么你虽然有action,但是如果没权限还是收不到,你也要懂权限字符串,并声明才行.

你可能感兴趣的:(Android)