本博客是對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);