Android 面试4——BroadcastReceiver

2019-05-13  本文已影响0人  锦岳

本文内容的搜集、整理,主要参考了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 中通过 <receiver> 标签注册
示例如下:

<receiver
    android:name=".MyReceiver">
// 接收电池电量改变时的广播
    <intent-filter>
        <action android:name="android.intent.action.BATTERY_CHANGED"/>
    </intent-filter>
</receiver>

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 发送出去。
广播分为五种类型,分别为:

1. Normal Broadcast

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

Intent intent = new Intent();
// 对应 BroadcastReceiver 中 intentFilter 的 action
intent.setAction(BROADCAST_ACTION);
// 发送广播
sendBroadcast(intent);

2. System Broadcast

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

3. Ordered Broadcast

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

sendOrderedBroadcast(intent);

4. Sticky Broadcast

已废弃

5. Local Broadcast

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

注:对于这种方式,只能通过 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);
上一篇 下一篇

猜你喜欢

热点阅读