本博客是对BrodcastReceiver基本面试知识的一个小结,该博客复制参考了Hensen_,感谢原文博主的分享,在前人的基础上做了补充,方便后期知识的回顾。
推荐博文:Android四大组件:BroadcastReceiver史上最全面解析
1、Broadcast Receiver是什么?
Broadcast是四大组件之一,是一种广泛运用在应用程序之间传输信息的机制,通过发送Intent来传送我们的数据。
2、Broadcast Receiver的使用场景
- 同一App具有多个进程的不同组件之间的消息通信.
- 不同App之间的组件之间的消息通信.
3、Broadcast Receiver的种类
普通广播 (Normal Broadcast): 开发者自身定义intent的广播(最常用)。
系统广播 (System Broadcast): Android中内置了多个系统广播:只要涉及到手机的基本操作(如开机、网络状态变化、拍照等等),都会发出相应的广播。
有序广播 (Ordered Broadcast): 发送出去的广播被广播接收者按照先后顺序接收,Priority值大的优先接收,值相同先注册的广播优先,先接收的广播可以进行修改、截断。
本地广播 (Local Broadcast):App应用内的广播,广播的发送者和接收者都同属于一个App,安全性高 & 效率高。
粘性广播 (Sticky Broadcast):在Android5.0 & API 21中已经失效。
4、Broadcast Receiver的实现
静态注册:注册后一直运行,尽管Activity、进程、App被杀死还是可以接收到广播。
动态注册:跟随Activity的生命周期变化的。
5、Broadcast Receiver内部实现机制
1.自定义广播类继承BroadcastReceiver,复写onReceiver()。
2.通过Binder机制向AMS(Activity Manager Service)进行注册广播.
3.广播发送者通过Binder机制向AMS发送广播。
4.AMS查找符合相应条件的广播发送到BroadcastReceiver(一般情况下是Activity)相应的循环队列中。
5.消息队列执行拿到广播,回调BroadcastReceiver的onReceiver()。
6、LocalBroadcastManager特点
1.本地广播只能在自身App内传播,不必担心泄漏隐私数据。
2.本地广播不允许其他App对你的App发送该广播,不必担心安全漏洞被利用。
3.本地广播比全局广播更高效。
4.以上三点都是源于其内部是用Handler实现的,相比系统广播通过Binder实现更高效,使用Handler实现,别的应用无法向我们应用发送广播,我们的应用内发送的广播也不会离开我们的应用。
5.LocalBroadcastManager内部协作主要是靠两个Map集合:mReceivers和mActions,以及一个List集合mPendingBroadcasts来存储待接收的广播对象。
7、代码实践
创建MyBroadcastReceiver广播接收器
public class MyBroadcastReceiver extends BroadcastReceiver {
// 接收广播方法,在intent中我们可以取出发送广播是携带的数据.
@Override
public void onReceive(Context context, Intent intent) {
// 接收到广播,处理需要的逻辑
}
}
接收系统广播(监听网络状态变化)
(1).静态注册:
<!--静态注册广播在Manifests注册-->
<receiver android:name=".receiver.MyBroadcastReceiver">
<!--用于指定此广播接收器将接收的广播类型-->
<!--本示例中给出的是用于接收网络状态改变时发出的广播-->
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
(2).动态注册:
package com.example.ling.myreview.receiver;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import com.example.ling.myreview.R;
public class BroadcastReceiverActivity extends AppCompatActivity {
private MyBroadcastReceiver mBroadcastReceiver = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_broadcast_receiver);
// 创建广播接收器
mBroadcastReceiver = new MyBroadcastReceiver();
}
@Override
protected void onResume() {
super.onResume();
// 注册广播接收器
//设置广播接收器将接收的广播类型
//用于接收网络状态改变时发出的广播
final String action = "android.net.conn.CONNECTIVITY_CHANGE";
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(action);
registerReceiver(mBroadcastReceiver, intentFilter);
}
@Override
protected void onPause() {
super.onPause();
// 解除注册广播接收器
unregisterReceiver(mBroadcastReceiver);
}
}
发送普通广播
(1). 发送广播:
Intent intent = new Intent();
//对应BroadcastReceiver中intentFilter的action
intent.setAction("YOU_BROADCAST_RECEIVER_ACTION");
//可以在intent中传递数据。
//发送广播
sendBroadcast(intent);
(2). 注册监听广播:
final String action = "YOU_BROADCAST_RECEIVER_ACTION";
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(action);
registerReceiver(mBroadcastReceiver, intentFilter);
(3). 解除监听广播:
unregisterReceiver(mBroadcastReceiver);
发送有序广播
// 发送有序广播
sendOrderedBroadcast(intent, null);
// 注册监听广播、解除监听广播代码类似省略。
本地广播
//步骤1:实例化BroadcastReceiver子类 & IntentFilter
MyBroadcastReceiver mBroadcastReceiver = new MyBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
//步骤2:实例化LocalBroadcastManager的实例
localBroadcastManager = LocalBroadcastManager.getInstance(this);
//步骤3:设置接收广播的类型
intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);
//步骤4:调用localBroadcastManager的registerReceiver()方法进行动态注册
localBroadcastManager.registerReceiver(mBroadcastReceiver, intentFilter);
//取消注册应用内广播接收器
localBroadcastManager.unregisterReceiver(mBroadcastReceiver);
//发送应用内广播
Intent intent = new Intent();
intent.setAction(BROADCAST_ACTION);
localBroadcastManager.sendBroadcast(intent);