Android8.0 接收斷網廣播
阿新 • • 發佈:2018-11-06
當我們在Android裝置上關閉網路連線時系統會發送網路改變廣播,如下:
08-12 14:51:57.763 877-968/? D/ConnectivityService: sendStickyBroadcast: action=android.net.conn.CONNECTIVITY_CHANGE
action
是android.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,並沒有解註冊,大家注意根據需要實現。