一. Android 中的廣播主要分兩種類型:標準廣播和有序廣播。 標準廣播(Normal broadcasts) 是一種完全非同步執行的廣播,在廣播發出之後,所有的廣播接收器幾乎都會在同一時刻接收到這條廣播消息,因此它們之間沒有任何先後順序可 言。這種廣播的效率會比較高,但同時也意味著它是無法被截斷 ...
一.
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身上失效了,因此我們還是使用了谷歌的手機以及模擬器來做測試才能夠獲得最終的成功。