1. 程式人生 > >Android8.0 接收斷網廣播

Android8.0 接收斷網廣播

當我們在Android裝置上關閉網路連線時系統會發送網路改變廣播,如下:
這裡寫圖片描述

08-12 14:51:57.763 877-968/? D/ConnectivityService: sendStickyBroadcast: action=android.net.conn.CONNECTIVITY_CHANGE

actionandroid.net.conn.CONNECTIVITY_CHANGE,只要我們知道了這個Action就可以寫一個廣播接收器來接收網路狀態的改變,並做出不同的處理邏輯,比如顯示一個斷網提示之類的什麼的。

下面看下程式碼

public class NetChangeReceiver
extends BroadcastReceiver {
@SuppressLint("UnsafeProtectedBroadcastReceiver") @Override public void onReceive(Context context, Intent intent) { try { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); if
(networkInfo != null && networkInfo.isAvailable()) { //有網處理 } else { //無網顯示個提示什麼的 } } catch (Exception e) { //ignore } } }

然後在清單檔案中註冊:

// 這裡注意路徑,每個人寫的包名不一樣,須修改成自己的包名下的路徑
<receiver android:name=".receiver.NetChangeReceiver "
>
<intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> </intent-filter> </receiver>

看起來完成了,在Android 5.1上試驗也沒問題,但是在8.0上的手機出問題了,具然收不到廣播。What?

查了下,發現,在Android8.0行為變理,大多數靜態註冊的廣播將接收不到,好吧。。。,將上述程式碼修改成靜態註冊的方式,測試,果然可以收到。

靜態註冊程式碼如下:

NetChangeReceiver receiver = new NetChangeReceiver ();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
mContext.registerReceiver(receiver, intentFilter);

這裡使用的全域性的Application,並沒有解註冊,大家注意根據需要實現。