Android 基础之 BroastCasts
BroadCasts 定义及其作用
BroadCasts 是一种广播机制,类似于发布-订阅这种机制,当发生一些事件的时候,系统或程序就会发送(发布)一些相关的广播,而注册(订阅)了这些广播的程序就会通过广播接收器去响应这些广播。 #### BroadCasts 的分类 1. 按作用范围来分: * 全局广播 * 本地广播 本地主要为了解决全局广播的安全性问题,由于全局广播是面向系统中所有应用的,所以当携带一些关键数据时可能会导致数据的泄漏。 2. 按接收顺序来分: * 标准广播 标准广播在发出之后,所有相关的广播接收器几乎能够一次性接收到该条广播。 * 有序广播 有序广播发出后,同一时间只有一个广播接收器能够接收到这条广播消息,只有当该广播接收器当中的处理逻辑处理完成之后,广播才能向下传递,并且优先级高的广播能够截断正在传递的广播。如果多个应用程序设置的优先级别相同,则谁先注册的广播,谁就可以优先接收到广播。
BroadCasts 的使用
广播机制的使用方法大体按照如下步骤:
- 创建广播接收器 Android 系统提供了一个 BroadCastReciver 的抽象类,所以需要创建自己的广播接收器,然后重写当中的 onReceive 方法,在当中编写事件的处理逻辑。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18class ForceReceiver extends BroadcastReceiver {
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() {
public void onClick(DialogInterface dialogInterface, int i) {
ActivityCollector.finishActivities();
Intent intent = new Intent(context, LoginActivity.class);
context.startActivity(intent);
}
}).show();
}
} - 注册广播 为了进行广播的接收还需要对需要接收的广播进行注册,注册方式可以分为两种: 第一种是动态注册,如果是全局广播则在 Activity 中直接调用 registerReceiver 方法即可,该方法主要接收两个参数,一个是 BroadCastReceiver,第二个则是 IntentFilter。如果是本地广播则需要借助系统提供的 LocalBroadCastManager 去进行注册,方法名与注册全局广播的方法名一致。 全局广播: 本地广播:
1
2
3IntentFilter intentFilter = new IntentFilter("com.rookieyang.forcelogin");
forceReceiver = new ForceReceiver();
registerReceiver(forceReceiver, intentFilter);第二种是静态注册,静态注册可以实现在程序未启动的情况下接收到广播,静态注册的广播是全局广播。1
2
3
4IntentFilter 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> - 发送广播 发送广播需要主要通过 Intent 传递信息,如果是是系统广播则不需要我们去编码去发送广播,如果是自定义的广播,发送标准广播则调用 sendBroadCast 方法,发送有序广播则调用 sendOrderedBroadcast 方法。如果是本地广播则和上文一致需要借助 LocalBroadCastManager 进行发送,本地广播没有有序广播。
1
2
3
4Intent intent = new Intent("com.rookieyang.forcelogin");
sendBroadcast(intent);
//sendOrderedBroadcast(intent);
localBroadcastManager.sendBroadcast(); - 接收处理 接收处理在广播接收器的 onReceive 方法中进行,创建广播接收器中已经说明,在此不再赘述。
- 取消注册 静态注册的不需要我们编码去取消注册,对于动态注册的则需要编码去取消注册,如果是全局广播则调用 unregisterReceiver 方法即可,如果是本地广播则调用 LocalBroadCastManager 对象的该方法即可。
1
2unregisterReceiver(forceReceiver);
localBroadcastManager.unregisterReceiver(forceReceiver);