Android 基础之 BroastCasts

BroadCasts 定义及其作用

BroadCasts 是一种广播机制,类似于发布-订阅这种机制,当发生一些事件的时候,系统或程序就会发送(发布)一些相关的广播,而注册(订阅)了这些广播的程序就会通过广播接收器去响应这些广播。 #### BroadCasts 的分类 1. 按作用范围来分: * 全局广播 * 本地广播 本地主要为了解决全局广播的安全性问题,由于全局广播是面向系统中所有应用的,所以当携带一些关键数据时可能会导致数据的泄漏。 2. 按接收顺序来分: * 标准广播 标准广播在发出之后,所有相关的广播接收器几乎能够一次性接收到该条广播。 * 有序广播 有序广播发出后,同一时间只有一个广播接收器能够接收到这条广播消息,只有当该广播接收器当中的处理逻辑处理完成之后,广播才能向下传递,并且优先级高的广播能够截断正在传递的广播。如果多个应用程序设置的优先级别相同,则谁先注册的广播,谁就可以优先接收到广播。

BroadCasts 的使用

广播机制的使用方法大体按照如下步骤:

  1. 创建广播接收器 Android 系统提供了一个 BroadCastReciver 的抽象类,所以需要创建自己的广播接收器,然后重写当中的 onReceive 方法,在当中编写事件的处理逻辑。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class ForceReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(final Context context, Intent intent) {
    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder.setTitle("提示");
    builder.setMessage("已经被退出");
    builder.setCancelable(false);
    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialogInterface, int i) {
    ActivityCollector.finishActivities();
    Intent intent = new Intent(context, LoginActivity.class);
    context.startActivity(intent);
    }
    }).show();
    }
    }
  2. 注册广播 为了进行广播的接收还需要对需要接收的广播进行注册,注册方式可以分为两种: 第一种是动态注册,如果是全局广播则在 Activity 中直接调用 registerReceiver 方法即可,该方法主要接收两个参数,一个是 BroadCastReceiver,第二个则是 IntentFilter。如果是本地广播则需要借助系统提供的 LocalBroadCastManager 去进行注册,方法名与注册全局广播的方法名一致。 全局广播:
    1
    2
    3
    IntentFilter intentFilter = new IntentFilter("com.rookieyang.forcelogin");
    forceReceiver = new ForceReceiver();
    registerReceiver(forceReceiver, intentFilter);
    本地广播:
    1
    2
    3
    4
    IntentFilter intentFilter = new IntentFilter("com.rookieyang.forcelogin");
    forceReceiver = new ForceReceiver();
    LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
    localBroadcastManager.registerReceiver(forceReceiver, intentFilter);
    第二种是静态注册,静态注册可以实现在程序未启动的情况下接收到广播,静态注册的广播是全局广播。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <receiver
    android:name=".BootCompleteReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
    </receiver>
    > 监听系统的开机广播是需要添加权限的,动态注册相比较于静态注册而言更为灵活,但是静态注册能够实现在应用未启动的情况下接收广播。而且动态注册的广播最后必须要取消注册。
  3. 发送广播 发送广播需要主要通过 Intent 传递信息,如果是是系统广播则不需要我们去编码去发送广播,如果是自定义的广播,发送标准广播则调用 sendBroadCast 方法,发送有序广播则调用 sendOrderedBroadcast 方法。如果是本地广播则和上文一致需要借助 LocalBroadCastManager 进行发送,本地广播没有有序广播。
    1
    2
    3
    4
    Intent intent = new Intent("com.rookieyang.forcelogin");
    sendBroadcast(intent);
    //sendOrderedBroadcast(intent);
    localBroadcastManager.sendBroadcast();
  4. 接收处理 接收处理在广播接收器的 onReceive 方法中进行,创建广播接收器中已经说明,在此不再赘述。
  5. 取消注册 静态注册的不需要我们编码去取消注册,对于动态注册的则需要编码去取消注册,如果是全局广播则调用 unregisterReceiver 方法即可,如果是本地广播则调用 LocalBroadCastManager 对象的该方法即可。
    1
    2
    unregisterReceiver(forceReceiver);
    localBroadcastManager.unregisterReceiver(forceReceiver);