一.
Android 中的廣播主要分兩種類型:標准廣播和有序廣播。
- 標准廣播(Normal broadcasts)
是一種完全異步執行的廣播,在廣播發出之后,所有的廣播接收器幾乎都會在同一時刻接收到這條廣播消息,因此它們之間沒有任何先后順序可 言。這種廣播的效率會比較高,但同時也意味着它是無法被截斷的。標准廣播的工作流程如下:

標准廣播工作示意圖
- 有序廣播(Ordered broadcasts)
是一種同步執行的廣播,在廣播發出之后,同一時刻只會有一個廣播接收器能夠收到這條廣播消息,當這個廣播接收器中的邏輯執行完畢后,廣播才會繼續傳遞。所以此時的廣播接收器是有先后順序的,優先級高的廣播接收器就可以先收到廣播消息,並且前面的廣播接收器還可以截斷正在傳遞的廣播,這樣后面的廣播接收器就無法收到廣播消息了。有序廣播的工作流程如下:

有序廣播工作示意圖
二.
注冊廣播的方式有兩種,在代碼中注冊(動態注冊)和在 AndroidManifest.xml 中注冊(靜態注冊)。
創建一個廣播接收器:新建一個類,繼承 BroadcastReceiver, 並重寫父類的 onReceive() 方法。當有廣播到來時,onReceive()方法就會得到執行, 具體的邏輯在這個方法中處理。
接下來先通過動態注冊的方式編寫一個能夠監聽網絡變化的程序,學習一下廣播接收器的基本用法。代碼如下:
/** * 廣播,動態監聽網絡變化 */ public class BroadcastActivity extends AppCompatActivity { private IntentFilter intentFilter; private NetworkChangeReceiver networkChangeReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_broadcast); // 創建 IntentFilter 實例 intentFilter = new IntentFilter(); // 添加廣播值 intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); // 創建 NetworkChangeReceiver 實例 networkChangeReceiver = new NetworkChangeReceiver(); // 注冊廣播 registerReceiver(networkChangeReceiver,intentFilter); } @Override protected void onDestroy() { super.onDestroy(); // 取消注冊 unregisterReceiver(networkChangeReceiver); } class NetworkChangeReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { // 獲取管理網絡連接的系統服務類的實例 ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); // 判斷網絡是否可用 if (networkInfo != null && networkInfo.isAvailable()){ ToastUtils.showShort("網絡可用"); }else { ToastUtils.showShort("網絡不可用"); } } } }
注意事項:
- 動態注冊的廣播接收器一定都要取消注冊才行,這里我們是在 onDestroy()方法中通過調用 unregisterReceiver()方法來實現的。
- 在 AndroidManifest.xml 文件中加入訪問系統的網絡狀態權限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
運行程序,然后按下 Home 鍵→按下 Menu 鍵→System settings→Data usage 進入到數據使用詳情界面,關閉 Mobile Data 會彈出網絡不可用的提示:
重新打開 Mobile Data 又會彈出網絡可用的提示:
備注:目前利用這種動態注冊的方式按道理來說應該在任何一款安卓手機上是有效的,但是卻在筆者本人的小米6身上失效了,因此我們還是使用了谷歌的手機以及模擬器來做測試才能夠獲得最終的成功。