Android 面试4——BroadcastReceiver

本文内容的搜集、整理,主要参考了Android四大组件:BroadcastReceiver史上最全面解析,在此致谢!

1. 定义与原理

  1. 定义:全局监听器,用于监听/接收应用发出的广播消息并做出反应。
  2. 原理:采用了 观察者模型:基于消息的发布/订阅事件模型

2. BroadcastReceiver 的注册

自定义 Receiver 类,并实现 BroadcastReceiver 基类

public class MyReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        
    }
}

广播接收器接收到相应的广播后,就会自动调用 onReceive() 方法
onReceive() 方法中,会设计到组件之间的交互等逻辑
不要在 onReceive() 方法中进行耗时操作

1. 静态注册

注册方式:在 AndroidManifest.xml 中通过 标签注册
示例如下:


// 接收电池电量改变时的广播
    
        
    

2. 动态注册

注册方式:在代码中调用 context.regsterReceiver() 方法

    private MyReceiver receiver = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 第 1 步,实例化 BroadcastReceiver
        receiver = new MyReceiver();
    }

    @Override
    protected void onResume() {
        super.onResume();
        // 第 2 步,创建过滤器并添加过滤条件
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_BATTERY_CHANGED);
        // 第 3 步,动态注册
        registerReceiver(receiver, filter);
    }

    @Override
    protected void onPause() {
        super.onPause();
        // 第 4 步,注销
        unregisterReceiver(receiver);
    }

注意:

  1. 动态广播必须注销,否则会造成内存泄漏
  2. 不允许重复注册,也不允许重复注销

3. 广播的发送

广播通过 Intent 标识,广播的发送就是通过 sendBroacast() 方法将 Intent 发送出去。
广播分为五种类型,分别为:

  • Normal Broadcast
  • System Broadcast
  • Ordered Broadcast
  • Sticky Broadcast
  • Local Broadcast

1. Normal Broadcast

最常用的广播,其基本使用方式如下:

Intent intent = new Intent();
// 对应 BroadcastReceiver 中 intentFilter 的 action
intent.setAction(BROADCAST_ACTION);
// 发送广播
sendBroadcast(intent);
  • 若广播接收者中注册时的 中的 action 与上述 action 一致,则接收当前广播。

2. System Broadcast

当使用系统广播时,只需要在注册 receiver 时,在 中选取合适的 action 即可,不需要手动发送广播。

3. Ordered Broadcast

发送出去的广播,按照先后顺序被相应的 receiver 接收。

  • receiver 接收广播的次序:
    • 按照 priority 值,由大到小排序;
    • priority 属性相同者,动态注册的广播优先。
  • 特点
    • 接收有序
    • 可以拦截广播
    • 可以修改广播
  • 使用方式
sendOrderedBroadcast(intent);

4. Sticky Broadcast

已废弃

5. Local Broadcast

可以理解为一种局部广播,广播内容的收/发都是在同一个 App 内完成
相比于全局广播,具有安全性高 & 效率高的优势

  • 使用方式 1 :将全局广播设置为局部广播
    1. 将注册 receiver 时的属性 exported 的值改为 false
    2. 在接收与发送广播时,增设相应的权限,用于权限验证
    3. 发送广播时,指定广播接收器所在的包:intent.setPackage(packageName)
  • 使用方式 2:使用 LocalBroadcastManager 类

注:对于这种方式,只能通过 LocalBroadcastManager 动态注册

        // 获取单例
        LocalBroadcastManager manager = LocalBroadcastManager.getInstance(this);
        // 注册
        manager.registerReceiver(receiver, filter);
        // 解除注册
        manager.unregisterReceiver(receiver);
        // 发送应用内广播
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_BATTERY_CHANGED);// 可自定义 action
        manager.sendBroadcast(intent);

你可能感兴趣的:(Android 面试4——BroadcastReceiver)