Android基础知识(十四):Broadcast Receiver简介与基本用法

Android基础知识(十四):Broadcast Receiver简介与基本用法

一、广播机制简介
为了便于进行系统级别的消息通知,Android引入了一套类似的广播消息机制。Android中的每个应用程序都可以对自己感兴趣的广播进行注册,从而接收到所关心的广播内容,这些广播可能来自系统,也可能来自其他应用程序。
广播的发送是通过Intent发送的,而广播的接收通过Broadcast Receiver(广播接收器)实现。
Android中的广播主要分为两类:标准广播有序广播

  1. 标准广播(Normal broadcasts)
    标准广播是一种完全异步执行的广播在广播发出之后,所有广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可言。这种广播的效率会比较高,但同时也意味着它是无法被截断的。标准广播的工作流如图所示。
    在这里插入图片描述
  2. 有序广播(Ordered broadcasts)
    有序广播是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够接收到这条消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递
    广播接收器是有先后顺序的,优先级高的广播接收器先收到广播消息,并且前面的广播接收器可以截断正在传递的广播。有序广播的工作流程如图所示。
    在这里插入图片描述

二、Broadcast Receiver注册方式及基本用法
广播接收器的注册方式有两种:动态注册AndroidManifest.xml文件中进行静态注册(Android8.0之前)
动态注册广播接收器的特点是当用来注册的Activity关掉后,广播也就失效静态注册无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器就是打开的状态,也就是说只要移动端处于开机状态,无论app是否开启该app订阅的广播在触发时也会对其起作用。

  1. 动态注册广播接收器
    如下代码所示为动态注册广播接收器,其中广播接收器为NetWorkChangeReceiver,通过IntentFilter对接收的广播进行筛选,筛选要接收的广播,并使用registerReceiver()方法进行动态注册。需要注意的是,动态注册的广播接收器需要取消注册,因此此处在onDestroy()方法中调用unregisterReceiver()方法实现。
private IntentFilter mIntentFilter;
    private NetWorkChangeReceiver mNetWorkChangeReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_broadcast_receiver_test);
        mIntentFilter = new IntentFilter();
        mIntentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        mNetWorkChangeReceiver = new NetWorkChangeReceiver();
        //动态注册广播接收器
        registerReceiver(mNetWorkChangeReceiver,mIntentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //注销广播接收器
        unregisterReceiver(mNetWorkChangeReceiver);
    }

    /**
     * 广播接收器
     */
    class NetWorkChangeReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "network changes", Toast.LENGTH_SHORT).show();
        }
    }
  1. 静态注册广播接收器
    静态注册广播接收器是在AndroidManifest.xml文件中注册,如下所示,其中enabled表示是否启用广播接收器,exported表示是否允许这个广播接收器接收本程序以外的广播。而action则表示接受一条值为“android.inten…"的广播,即表明了该广播接收器可接受的广播
<receiver android:name=".StaticBroadcastReceiver"
          android:enabled="true"
          android:exported="true">
          <intent-filter>
                <action android:name="android.intent.action.STATICBROADCASTRECEIVER"></action>
          </intent-filter>
 </receiver>

参考资料:《第一行代码 Android 第2版》

猜你喜欢

转载自blog.csdn.net/weixin_38196407/article/details/89498829